Как я могу сделать так, чтобы GNU Screen запускался с запущенной внутри него программой, чтобы она не выходила из сеанса по завершении программы? - PullRequest
24 голосов
/ 30 июня 2011

Как мне написать скрипт GNU Screen для запуска с запущенной в нем программой, чтобы он не выходил из сеанса по завершении программы?

Я хочу запустить интерактивную программу в качестве демона, если я вручную запускаю экран, а затем запускаю эту программу внутри него, все работает так, как я хочу. Если программа завершается или завершается сбоем, сеанс экрана остается, и я могу посмотреть, что только что произошло. Тем не менее, если я запускаю программу с простым запуском экрана, то она запускается внутри экрана, но когда программа выходит из экрана, сеанс экрана заканчивается, и любой вывод из программы теряется.

Так что screen –dmS serverName serverApplication не работает для моего сценария. Я действительно думал о создании сценария, который запускает программу, которую я хочу запустить, а затем спит навсегда, затем я мог запустить сценарий в то же время, что и экран, и должен получить эффект, которого я добиваюсь, но это выглядит довольно неопрятным способом делать вещи и я уверен, что должно быть что-то более элегантное.

Я прочитал довольно много экранных обучающих программ и пролистал справочную страницу, но ничто не вылилось на меня как правильный способ сделать это. Я пробовал –X, но это для экранных команд, а не для запуска команд внутри экранной сессии ... Любые предложения будут очень благодарны; Я даже рад использовать что-то, кроме GNU Screen, если есть лучший инструмент для использования в скриптах, но, пожалуйста, приведите пример, где это возможно.

(Примечание: две вещи, с которыми я буду работать, это minecraft_server и mythtv_backend. Я планировал запустить их из задания chron при загрузке с помощью сценария ruby ​​/ bash)

1 Ответ

28 голосов
/ 12 июля 2011

Сначала вы захотите запустить сеанс экрана демона, просто запустив оболочку по умолчанию:

$ screen -dmS "serverName"

Затем отправьте команду в эту оболочку, используя stuff экрана в сочетании с -X:

$ screen -S "serverName" -p 0 -X stuff "serverApplication$(printf \\r)"

-p важен для указания экрану, в какое окно в этом сеансе вводить команду.В этом случае это единственное доступное окно, 0, но если вы не укажете это, по какой-то странной причине ваша команда никуда не денется.$(printf \\r) отправляет нажатие клавиши «Return».Обычный \n может работать вместо него, но Я прочитал , это зависит от оболочки.Символ перевода строки не работает в bash;Я могу ручаться за это.

Вот еще один крутой трюк.Если вы хотите создать другое окно экрана в этом сеансе, вы можете:

$ screen -S "serverName" -X screen

Теперь вы можете отправлять ему команды, используя тот же синтаксис, что и выше, но с -p 1.Очень весело.

...