我试图强制 GNU 屏幕创建一个“虚拟”终端,而不附加到它,在里面执行脚本,并且在脚本结束后不终止会话。
我尝试了很多组合,包括:
screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh
或者
screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh
但他们都不起作用。我要么获得没有执行脚本的会话,要么执行脚本,但会话一旦完成就会终止,或者收到“找不到屏幕会话”错误。
我基本上想做的是运行用 PHP 编写的 UDP 侦听器,并使其在无限循环中工作(不要中断侦听)。是的——我可以&
在最后运行 PHP 脚本,强制 PHP CLI 作为守护进程运行。问题是,我正在使用一个名为服务器的垃圾(QNAP - 永远不要购买这个垃圾!),它似乎忽略了这一点。一旦我注销 SSH 会话,脚本就会停止。
所以screen
似乎是唯一的选择。但我不明白,为什么一旦执行的命令或脚本结束它就会终止会话?
编辑:我也尝试过在互联网上找到的示例:
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
不缺!附加到它 ( screen -R name
) 后,我看到 Midnight Commander 尚未被执行。尽管示例作者说过,但确实如此。
答案1
要在脚本完成后保持屏幕忙碌,只需在窗口中保持某些内容持续运行即可。对于这个“东西”来说,最简单的选择可能是交互式 shell。这是一种方法(假设bash
选择交互式 shell):
screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
-dm
:以分离模式启动屏幕-S
:设置屏幕的会话名称,以便稍后检索sh -c '...'
:不要简单地运行将终止的脚本,而是用于sh -c
运行多个命令exec bash
:脚本终止后,sh
上面的内容将切换到交互式 shell (bash
),在外部终止它之前,它永远不会退出。screen
只要bash
实例还活着,它就会保持打开状态。
答案2
sh -c
我的 raspberry pi 2 运行 Debian 7.8 时运气不佳。但bash -c
做了工作:
命令:
/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"
答案3
我不终止会话的动机是为了不丢失会话的输出。在这种背景下script
,我想到了Linux 工具。
rm script_session.log
script -e -f -a script_session.log -c "screen /dev/ttyUSB0 115200"
如果拔掉串行 USB 适配器,会话就会终止,但我仍然可以读取script_session.log
.但不是这样,cat
因为“script_session.log”中包含的转义序列使输出从终端消失。您可以使用例如gedit
或vi
或 从文件中删除转义序列的工具。
也许script
对于分离会话也可能有用screen
。