
Я запускаю программу в сеансе Screen, и если программа аварийно завершает работу, она перезапускается, но когда программа аварийно завершает работу, сеанс Screen завершается.
Я хочу, чтобы сеанс экрана оставался открытым, чтобы программа могла перезапуститься. Есть ли способ сделать это?
Я использую Linux Debian 7 Wheezy
решение1
Вопрос в том, насколько странно программа вылетает? Первые две вещи, которые приходят мне в голову:
- программа на последнем издыхании посылает какие-то странные управляющие последовательности, которые
screen
также приводят к сбою/завершению работы/думают, что лучше не показывать вам это. - программа посылает сигналы своим родительским процессам (
screen
или, может быть, промежуточнымоболочка), который завершает их.
Следующие шаги, которые я бы попробовал:
- Как именно
screen
завершается? Убивает ли он весьscreen
процесс или только его собственное окно (живы ли параллельно работающие экранные команды, отсоединяется ли сеанс экрана)? - Если вы запустите программу из оболочки, можете ли выловить сигналыисходя из программы, использующейловушка?
- Будет ли он по-прежнему завершен
screen
, если вы перенаправитестандартный выводиstderrв файл (что содержит файл, если он больше не падает — мне интересно). Может быть, вы все еще можете наблюдать за работой программы с помощьюtail -f
. - Хорошо, обход не даст интересных идей, но возникает ли та же проблема при использовании
tmux
вместоscreen
?
Редактирование 1 (ad 1): Программа, вызывающая сбой, может быть запущена непосредственно с экрана, например
screen /usr/local/bin/your/crashing/program
или с промежуточным процессом оболочки (например, вы открываете окно экрана с вашей любимой оболочкой, а затем запускаете программу, например
screen
/usr/local/bin/your/crashing/program
или иметь скрипт оболочки, который выполняет респаун с помощью чего-то вроде
bash -c 'while true ; do /usr/local/bin/your/crashing/program ; done'
По результатам работы можно определить, pstree
какие процессы задействованы:
xterm(309)---bash(311)---screen(230)---screen(231)---bash(234)-+-less(323)
`-pstree(322)
В моем случае я запустил screen
(230 и 231) из окна bash
(311) в xterm
(309) с другим окном bash
(234), из которого я запустил pstree | less
(322 и 323).
Screen завершается, если завершается дочерний процесс. Это нормальное поведение, а не сбой. Поэтому, если ваша программа запущена непосредственно в screen и падает, screen также завершается. Если вы запустили свою программу вручную в оболочке, эта оболочка должна снова представить свое приглашение после сбоя программы. Если окно screen закрывается в этом случае, то на самом деле что-то странное.
Было бы полезно немного узнать об этом, например, как вы запускаете и перезапускаете свою программу.