如何编写GNU Screen脚本以启动在其中运行的程序,以便在程序完成时不会退出会话?
我想将一个交互式程序作为一个守护进程运行,如果我手动启动屏幕,然后在其中启动该程序,一切正常,就像我想要的那样。如果程序退出或崩溃,屏幕会话仍然存在,我可以去看看它刚刚发生了什么。但是,如果我使用简单的屏幕启动启动程序,那么它会在屏幕内运行,但是当程序退出时,屏幕会话结束并且程序的任何输出都会丢失。
所以screen –dmS serverName serverApplication
对我的方案不起作用。我确实想过制作一个启动我要运行的程序的脚本&然后永远睡觉,然后我可以在屏幕的同时启动脚本,并且应该得到我想要的效果,但它似乎是一种不整洁的做事方式,我相信一定有更优雅的东西。
我已经阅读了很多屏幕教程并在手册页中搜索过,但是没有任何东西可以跳出来作为正确的方法。我尝试过-X但是这是用于屏幕命令,而不是用于在屏幕会话中运行命令...任何建议都将非常感激;如果有更好的脚本编写工具,我甚至乐意使用除GNU Screen之外的其他东西,但请尽可能给我一个例子。
(旁注:我将运行的两件事是一个minecraft_server和一个mythtv_backend。我的计划是通过一些ruby / bash脚本从一个chron作业启动这些)
答案 0 :(得分:28)
首先,您将要运行默认shell启动守护程序屏幕会话:
$ screen -dmS "serverName"
然后,使用屏幕stuff
和-X
将您的命令发送到该shell:
$ screen -S "serverName" -p 0 -X stuff "serverApplication$(printf \\r)"
-p
对于告诉屏幕进入该会话中的哪个窗口以填充命令非常重要。在这种情况下,它是唯一可用的窗口,0,但如果你没有指定,那么由于一些奇怪的原因,你的命令将无处可去。 $(printf \\r)
发送“返回”按键。常规\n
可能会起作用,但I've read依赖于shell。换行符在bash中不起作用;我可以担保。
这是另一个很酷的技巧。如果您想在该会话中创建另一个屏幕窗口,您可以:
$ screen -S "serverName" -X screen
现在,您可以使用与上面相同的语法向{1}}发送命令。很有趣。