如何编写GNU Screen脚本以启动在其中运行的程序,以便它不会在程序完成时退出会话?

Taf*_*afT 24 daemon gnu-screen

如何编写GNU Screen脚本以启动在其中运行的程序,以便在程序完成时它不会退出会话?

我想作为一个守护进程运行一个交互式程序,如果我手动启动屏幕,然后在其中启动该程序,一切正常,我想要的.如果程序退出或崩溃,屏幕会话仍然存在,我可以去看看它刚刚发生了什么.但是,如果我使用简单的屏幕启动启动程序,那么它会在屏幕内运行,但是当程序退出时,屏幕会话结束并且程序的任何输出都会丢失.

所以screen –dmS serverName serverApplication对我的方案不起作用.我确实想过制作一个启动我要运行的程序的脚本然后永远睡觉,然后我可以在屏幕的同时启动脚本并且应该得到我想要的效果但是它似乎是一种不整洁的做事方式我相信一定有更优雅的东西.

我已经阅读了很多屏幕教程并在手册页中进行了搜索,但没有任何内容可以作为正确的方法来实现.我尝试过-X但是这是用于屏幕命令,而不是用于在屏幕会话中运行命令...任何建议都将非常感激; 如果有更好的脚本编写工具,我甚至乐意使用除GNU Screen之外的其他东西,但请尽可能给我一个例子.

(旁注:我将运行的两件事是一个minecraft_server和一个mythtv_backend.我的计划是通过一些ruby/bash脚本从启动时的chron作业启动它们)

Eri*_*ric 29

首先,您将要运行默认shell启动守护程序屏幕会话:

$ screen -dmS "serverName"
Run Code Online (Sandbox Code Playgroud)

然后,使用屏幕stuff结合以下命令将命令发送到该shell -X:

$ screen -S "serverName" -p 0 -X stuff "serverApplication$(printf \\r)"
Run Code Online (Sandbox Code Playgroud)

-p是告诉屏幕成会话中哪个窗口塞住命令重要.在这种情况下,它是唯一可用的窗口,0,但如果你没有指定,那么由于一些奇怪的原因,你的命令将无处可去.在$(printf \\r)发送一个"返回"按键.一个常规\n可能会在它的位置工作,但我已经读过它依赖于shell.换行符在bash中不起作用; 我可以担保.

这是另一个很酷的技巧.如果您想在该会话中创建另一个屏幕窗口,您可以:

$ screen -S "serverName" -X screen
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用与上面相同的语法向该命令发送命令,但使用-p 1.很有意思.

  • 我只是在一个简单的情况下尝试了这个,并且似乎不需要填充屏幕命令.exec可以正常使用`-p 0`参数,这意味着我没有看到$(printf \\ r)来执行脚本.`$ screen -dmS"serverName"$ screen -S"serverName"-p 0 -X exec severApplication` (3认同)
  • 5年后,仍然是搜索全天实际工作后的唯一结果.谢谢. (2认同)