如何防止屏幕在进程结束后终止

如何防止屏幕在进程结束后终止

我正在命名屏幕中启动一个进程,例如:

screen -dmS myscreen bash -c "export VAR=123; cd /usr/local/myproject; ./myscript.py"

然而,几分钟后,我的脚本崩溃了,当它退出时,屏幕终止,所以我看不到调试输出。我的脚本运行时间足够长,因此我可以手动附加到屏幕,但屏幕仍然自动终止,将我踢出它。

当正在运行的进程停止时,如何阻止屏幕退出?

答案1

您可以使用管道将输出传送到less文件,tee然后传送到文件less,或者只是sleep 99999在命令后面添加一个“暂停”命令。

screen -dmS myscreen bash -c "export VAR=123; cd /usr/local/myproject; ./myscript.py; sleep 9999"

无论如何,我建议从 切换screentmux,您可以使用问题来了解如何运行命令并在退出后保留它。

基本上你可以添加bash -i到命令的末尾。

tmux start-server  
tmux new-session -d
tmux new-window 'ls;bash -i'

或者你可以使用选项remain-on-exit

退出时设置保留 [on |离开]

当此选项为 true 时,正在运行的程序已退出的窗口不会关闭,而是保持打开状态但不活动。

答案2

默认情况下,screen当正在运行的命令关闭时退出,正如您所观察到的。当您screen单独启动时,它运行的命令是一个交互式 shell,当然,当它的子级退出时,它不会退出。

如果您希望能够从另一个脚本实现类似的目标,您可以这样做

screen -dm -S myscreen
screen -S myscreen -X stuff "export VAR=123; cd /usr/local/myproject^M"
screen -S myscreen -X stuff "./myscript.py && exit^M"

这首先会启动一个新屏幕,其中将运行一个登录 shell,并且在登录 shell 退出之前不会关闭。然后,您可以使用screenstuff命令将文本输入到该 shell 中。在第一行,我们定义变量并更改目录。在第二行,我们启动脚本,然后退出 shell(此处假设您希望在脚本成功时关闭屏幕会话)。但是,由于短路和 ( &&),如果myscript.py失败,则exit永远不会发生,您可以自由地重新连接到屏幕会话并查看发生了什么。

请注意,要^M正确输入,您需要键入^V(control-v),然后键入^M(与 Enter 键相同)。

相关内容