Сеанс экрана завершается при сбое программы

Сеанс экрана завершается при сбое программы

Я запускаю программу в сеансе Screen, и если программа аварийно завершает работу, она перезапускается, но когда программа аварийно завершает работу, сеанс Screen завершается.

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

Я использую Linux Debian 7 Wheezy

решение1

Вопрос в том, насколько странно программа вылетает? Первые две вещи, которые приходят мне в голову:

  • программа на последнем издыхании посылает какие-то странные управляющие последовательности, которые screenтакже приводят к сбою/завершению работы/думают, что лучше не показывать вам это.
  • программа посылает сигналы своим родительским процессам ( screenили, может быть, промежуточнымоболочка), который завершает их.

Следующие шаги, которые я бы попробовал:

  1. Как именно screenзавершается? Убивает ли он весь screenпроцесс или только его собственное окно (живы ли параллельно работающие экранные команды, отсоединяется ли сеанс экрана)?
  2. Если вы запустите программу из оболочки, можете ли выловить сигналыисходя из программы, использующейловушка?
  3. Будет ли он по-прежнему завершен screen, если вы перенаправитестандартный выводиstderrв файл (что содержит файл, если он больше не падает — мне интересно). Может быть, вы все еще можете наблюдать за работой программы с помощью tail -f.
  4. Хорошо, обход не даст интересных идей, но возникает ли та же проблема при использовании 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 закрывается в этом случае, то на самом деле что-то странное.

Было бы полезно немного узнать об этом, например, как вы запускаете и перезапускаете свою программу.

Связанный контент