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_after是java退出后我想要运行的命令.
这是行不通的,因为我无法恢复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)
这应该意味着:
pid的screen应该是相同的java,但工程.screen,所以我应该能够达到它screen -r SERVER(但我不能).当我在没有&符号的情况下运行线路时将它放在后台,直到java退出时它才会执行任何操作.没有输出.
如果你运行 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。