一旦执行的脚本结束,防止 GNU 屏幕终止会话

一旦执行的脚本结束,防止 GNU 屏幕终止会话

我试图强制 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”中包含的转义序列使输出从终端消失。您可以使用例如geditvi或 从文件中删除转义序列的工具。

也许script对于分离会话也可能有用screen

相关内容