我正在屏幕会话中运行一个程序,如果程序崩溃,它会自行重新启动,但是当程序崩溃时,屏幕会话将终止。
我希望屏幕会话保持打开状态,以便程序可以自行重新启动。有什么办法吗?
我正在运行 Linux Debian 7 Wheezy
答案1
问题是,程序崩溃有多奇怪?我首先想到的两件事:
- 该程序在最后一口气时发出一些奇怪的控制序列,这些序列
screen
也会让你崩溃/终止/认为最好不要让你看到这个。 - 程序向其父进程(
screen
或者可能是中间进程)发送信号壳) 终止它们。
我会尝试的后续步骤:
- 终止的精确度如何
screen
?它会杀死整个screen
进程还是只杀死它自己的窗口(并行运行的屏幕命令是否仍然存在,屏幕会话是否会分离)? - 如果您从 shell 运行该程序,您可以捕捉信号来自使用的程序陷阱?
screen
如果您重定向它是否仍然终止标准输出和标准错误到一个文件(如果它不再崩溃,该文件包含什么 - 我很好奇)。也许您仍然可以使用 来观看程序运行tail -f
。- 好的,规避不会提供有趣的见解,但是使用
tmux
代替时是否存在同样的问题screen
?
编辑1(广告1):崩溃的程序可以直接从屏幕运行,例如
screen /usr/local/bin/your/crashing/program
或者在中间使用 shell 进程(例如,使用您最喜欢的 shell 启动屏幕窗口,然后运行该程序,例如
screen
/usr/local/bin/your/crashing/program
或者有一个 shell 脚本来执行重生,例如
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)
就我而言,我有一个从(309)窗口中的(311 screen
)开始的(230和231)以及另一个(234),我从中运行(322和323)。bash
xterm
bash
pstree | less
如果子进程终止,则屏幕终止。这是正常行为,而不是崩溃。因此,如果您的程序直接在 screen 中启动并崩溃,那么 screen 也会终止。如果您在 shell 中手动启动程序,则该 shell 应在程序崩溃后再次显示提示符。如果在这种情况下屏幕窗口关闭,则确实有些奇怪的事情。
了解一些迂回的知识会很有帮助,例如如何启动和重生程序。