GNU屏幕问题

时间:2014-06-04 20:59:57

标签: bash process jobs pid gnu-screen

我试图以特殊方式运行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

/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.

这应该意味着:

  1. pid的{​​{1}}应与screen的{​​{1}}相同,但这样可行。
  2. 它仍然是java,所以我应该能够screen(但我不能)。
  3. 当我在没有&符号的情况下运行该行并将其放在后台时,它只会在screen -r SERVER退出之前不执行任何操作。没有输出。

1 个答案:

答案 0 :(得分:1)

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

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

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

pidchild=$(pgrep -P $PID)

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

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