我正在命名屏幕中启动一个进程,例如:
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"
无论如何,我建议从 切换screen
到tmux
,您可以使用这问题来了解如何运行命令并在退出后保留它。
基本上你可以添加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 退出之前不会关闭。然后,您可以使用screen
的stuff
命令将文本输入到该 shell 中。在第一行,我们定义变量并更改目录。在第二行,我们启动脚本,然后退出 shell(此处假设您希望在脚本成功时关闭屏幕会话)。但是,由于短路和 ( &&
),如果myscript.py
失败,则exit
永远不会发生,您可以自由地重新连接到屏幕会话并查看发生了什么。
请注意,要^M
正确输入,您需要键入^V
(control-v),然后键入^M
(与 Enter 键相同)。