Запустіть програму з екрана GNU та негайно від'єднайтесь після


27

Я намагаюся розібратися, як написати сценарій, який би запускав програми (програми) на сесіях екрану GNU під час завантаження системи. Я намагаюся це:

#!/bin/bash
screen -S test -d -m -X $HOME/folder/folder/.program \
screen -S test2 -d -m -X $HOME/folder/folder/.program2 \

але команда не може бути виконана, тому що сеанс вже відключений? Єдине, що мені потрібно - це запустити команду на екранній сесії та негайно відключити цей сеанс.

Дякую за відповіді, але зараз я зіткнувся з іншою проблемою. Сценарій припиняє роботу після того, як я помістив деякі змінні для моєї програми та програми2. Щось на зразок цього:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program -f config.cfg

чомусь "-f config.cfg" проігнорували. Я також намагаюся процитувати команду і не допомагає теж.


Чому -Xваріант?
— enzotib

Відповіді:


34

Ви справді мали намір поставити \кінець рядка? Якщо ні, то спробуйте їх видалити - вони уникають наступного символу.

також, скасування довідки -Xдопомагає мені налаштувати роботу, наприклад:

screen -S test -d -m -X touch /tmp/test

No screen session foundоднак не вдається :

screen -S test -d -m touch /tmp/test

працює чудово. Як такий, я підозрюю, що для вас буде працювати наступне:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program
screen -S test2 -d -m $HOME/folder/folder/.program2

Пам'ятайте, що якщо ви запускаєте це під час завантаження, $ HOME не є таким, як після входу в систему як конкретний користувач. Якщо вам потрібно запустити його як певний користувач, вам потрібно буде використовувати вподобання, suщоб запустити його як цього користувача, а вказавши повний шлях, вилучите будь-яку неоднозначність:

#!/bin/bash
screen -S test -d -m su - username /home/username/folder/folder/.program
screen -S test2 -d -m su - username /home/username/folder/folder/.program2

Або ви б назвали весь сценарій вище як su - username /path/to/your/script.


Дякую за відповіді, але зараз я зіткнувся з іншою проблемою. Сценарій перестає працювати після того, як я помістив деякі змінні для моєї програми та програми2
— TbMa

Це: screen -S test -d -m $HOME/folder/folder/.programмайже робить саме те, що я шукаю, за винятком випадків, коли папка / .програма закінчена, сеанс екрана автоматично закривається. Чи є спосіб зберегти сеанс (оболонку) екрана навіть після виконання програми? Можливо, замість ексклюзивного запуску програми, запустити оболонку, яка запускає програму, а потім повертається до підказки оболонки чи щось?
— RocketNuts

4

Як згадував Cry Havok, ви можете розмістити програму прямо в командному рядку.

Якщо ви дійсно повинні використовувати опцію -X, то а) вам потрібно вказати команду 'screen' і б) сеанс повинен існувати заздалегідь.

screen -dmS test
screen -S test -X screen $HOME/folder/folder/.program
screen -dmS test2
screen -S test2 -X screen $HOME/folder/folder/.program2

Якщо ви розмістите програму в командному рядку, екран закриється, коли програма закінчується; Я не бачу прапор командного рядка, щоб тримати екран відкритим, якщо ви хочете бачити вихід консолі. Якщо ви запускаєте екран і надсилаєте команди окремо, як показано тут, можливо, вам знадобляться явні sleepкоманди, щоб дати екрану час для початку сеансу перед відправленням команди.
— Chinasaur

Ця відповідь дуже схожа на відповідь stackoverflow.com, яка відповідає на подібне запитання . Я віддаю перевагу цій відповіді більше ніж @CryHavok, тому що ця відповідь виконує вашу програму всередині оболонки за замовчуванням вашого користувача (@CryHavok запускає вашу програму без батьківської оболонки, тому коли програма загине або ви ctrl-c її сеанс екрана негайно припиняється)
— Тревор Бойд Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.