GNU屏幕问题

Cod*_*256 5 bash jobs pid gnu-screen process

我试图以screen一种特殊的方式运行(我正在制作一个不寻常的脚本),但它无法正常工作.


我的剧本:

#!/bin/bash
#startserver


set -m

cd /home/USER/SERVER_FOLDER/

screen -Dm -S SERVER java -Xmx768M -Xms768M -jar ./JARFILE.jar $@ &

PID=$!
echo $PID > ./.mc.pid
(sleep 0.5; sudo /usr/bin/oom-priority $PID) &

(wait $PID; startserver_after) &

screen -r $PID.SERVER
Run Code Online (Sandbox Code Playgroud)

/usr/bin/oom-priority是我做的一个命令,它设置了pid的优先级-16.

startserver_afterjava退出后我想要运行的命令.

这是行不通的,因为我无法恢复screen.查看screen联机帮助页:

-D -m   This also starts screen in "detached" mode, but doesn't fork a new process. The command exits if the session terminates.
Run Code Online (Sandbox Code Playgroud)

这应该意味着:

  1. pidscreen应该是相同的java,但工程.
  2. 它仍然是screen,所以我应该能够达到它screen -r SERVER(但我不能).

当我在没有&符号的情况下运行线路时将它放在后台,直到java退出时它才会执行任何操作.没有输出.

Mik*_*e S 1

如果你运行 screen -Dm,它不会返回到你的命令行提示符(“无分叉”的想法;这就是为什么如果你没有&符号,它不会执行任何操作,直到你的java退出)。如果您使用 运行它-dm,它会立即返回到命令行提示符。

通过将其置于-Dm后台,您已使其分叉并$!使用屏幕进程的 PID 进行设置。所以这样很好。

您正在设置oom-priority屏幕的(我怀疑您想这样做;我认为您的目标是 Java)。您可以获取您孩子的 pid,如下所示:

pidchild=$(pgrep -P $PID)
Run Code Online (Sandbox Code Playgroud)

startserver_after屏幕退出后您真的想要吗?也许你也想wait对孩子说。

关于screen -r最后:它应该可以工作,除非你没有 tty 作为脚本的标准输入,或者 java 已经退出。ps -p $pidchild之后立即尝试一下screen -r,看看孩子是否还活着。还tty作为脚本的最后一个命令运行,并确保它不返回Not a tty