Как выполнить команду на экране и отсоединить?

75

Как я могу получить экран для выполнения команды, а затем отключить (то есть автоматически в одном скрипте без дополнительного ввода после первоначального запуска скрипта)? Например, я запускаю myscript.sh, и он автоматически запускает сеанс экрана, выполняет команду, а затем отключается.

darkfeline
источник

Ответы:

114

Это легко:

screen -d -m yourcommand
Алан Карри
источник
4
без кости команда screen -d -m, screen -list говорит, что сокетов нет, screen -r нет сеансов
darkfeline
1
Каким-то образом ваша команда не была найдена или работает неправильно в автоматически создаваемой экранной среде. Попробуйте просто делать screen yourcommandбез -dи -mувидеть , как это происходит в первую очередь.
Алан Карри
Ты вроде как прав. Экран заканчивается, когда команда заканчивается, вопреки моим ожиданиям. Но твой ответ работает.
darkfeline
3
Вы можете изменить это, включив zombieопцию на экране. Положи zombie xyв свой ~/.screenrc. Также должно быть возможно включить его только для одного сеанса, добавив zombie xyв него другой файл и использовав его, -c fileно по какой-то причине это не работает, когда я пытаюсь это сделать. Или просто использоватьsh -c 'yourcommand;while :;do sleep 9999; done'
Алан Карри
@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, команда запуска, отсоединение .

kenorb
источник
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 Проблема в том, что у вас есть команда в кавычках, и поэтому она рассматривается как одна большая команда. Очевидно, что мы не можем вывести его из кавычек из-за точки с запятой. Чтобы решить эту проблему, выполните команду следующим образом: screen -S sleepy -dm bash -c "cd myfolder; sleep 60"
Джейсон Томпсон
3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'
tkjef
источник
0

это случилось со мной, когда я нажал control c (sig int), чтобы выйти из моей программы. он выходит полностью из всего bash. так что я нашел это, чтобы поймать 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 event

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
Шимон Дудкин
источник