Як виконати команду на екрані та від'єднати?


75

Як я можу змусити екран виконати команду, а потім від'єднати її (тобто автоматично в одному сценарії без подальшого введення за межі початкового запуску сценарію)? наприклад, я запускаю myscript.sh, і він автоматично запускає сеанс на екрані, виконує команду, потім відривається.

Відповіді:


114

Це легко:

screen -d -m yourcommand

4
без кісток. screen -d -m команда, screen -list каже, що немає сокетів, екран -r немає сесій
darkfeline

1
Якось ваша команда не була знайдена або не працює коректно в автоматично створеному екрані. Спробуйте просто робити screen yourcommandбез -dі -mпобачити , як це відбувається в першу чергу.
Алан Керрі

Ти такий собі прав. екран закінчується, коли команда закінчується, всупереч моїм очікуванням. Але ваша відповідь спрацює.
darkfeline

3
Ви можете змінити це, включивши zombieопцію на екрані. Покладіть zombie xyу своє ~/.screenrc. Також слід мати можливість ввімкнути його лише для одного сеансу, b введення zombie xyіншого файлу та використання, -c fileале чомусь це не працює, коли я його намагаюся. Або просто скористайтесяsh -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry

@AlanCurry, Ні, це також не працює для мене, навіть якщо команда працює в ідеалі (і займає кілька годин) при запуску в екрані вручну.
Серін

47

Щоб запустити одну команду на екрані та від'єднати її, ви можете спробувати:

screen -dm sleep 10

Щоб запустити кілька команд, спробуйте:

screen -dm bash -c "sleep 10; myscript.sh"

Зверніть увагу, що коли програма завершується, екран (за замовчуванням) вбиває вікно, яке містило її.

Якщо ви не хочете, щоб ваш сеанс був убитий після завершення сценарію, додайте exec shйого наприкінці, наприклад:

screen -dm bash -c 'sleep 5; exec sh'

Щоб перерахувати всі свої сеанси, спробуйте:

screen -list

Пов’язані дані: Запустити екран Unix, команда Запустити, Від'єднати .


2
Це працювало для мене на Ubuntu 16.04. Крім того , щоб назвати вашу сесію , так що ви можете повернутися до нього пізніше, додайте -S sessionname: screen -dmS MyLongRunningScript bash -c "...".
Дан Даскалеску

16

Щоб почати новий сеанс у фоновому режимі з назвою 'сонний'

screen -S sleepy -dm sleep 60

Аби вбити «сонний» сеанс

screen -S sleepy -X quit      

чому це не працює screen -S sleepy -dm "cd myfolder;sleep 60"?
Інструментарій

@Toolkit Проблема полягає в тому, що ви маєте команду в лапках, і тому вона трактувалася як одна велика команда. Очевидно, що ми не можемо витягнути його з лапок через крапку з комою. Щоб вирішити це, виконайте команду так: екран -S сонний -dm bash -c "cd myfolder; sleep 60"
Jason Thompson


0

це трапляється зі мною, коли я натискаю клавішу управління c (sig int), щоб вийти з програми. він виходить з усіх башів. тому я знайшов це, щоб зловити SIGINT. і запобігти виходу з останнього удару. (для входу потрібно ввести вихід)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

Мені корисно використовувати cron для запуску програм nodejs при запуску. та запустити екран під час завантаження. в cron є синтаксис спеціальних подій @reboot подія

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.