我试图以特殊方式运行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.
这应该意味着:
pid
的{{1}}应与screen
的{{1}}相同,但这样可行。java
,所以我应该能够screen
(但我不能)。当我在没有&符号的情况下运行该行并将其放在后台时,它只会在screen -r SERVER
退出之前不执行任何操作。没有输出。
答案 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
。