GNU Screen 问题

5

我正在尝试以特殊的方式运行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. screenpid 应该与 java 的相同,但不管怎样都可以。
  2. 它仍然是 screen,所以我应该能够通过 screen -r SERVER 访问它(但我不能)。

当我运行此行时,如果没有把它放在后台并添加 ampersand 符号,它就会一直等到 java 退出而没有输出。


screen -r SERVER 返回什么? - mofoe
2
此外,为什么在等待后会有一个有效的 $PID?在 fork 过程中,wait 命令会“等待”子进程完成。因此,一旦 wait 命令返回,就没有 PID 可以返回,因为该进程已经结束了。请谷歌搜索“bash 中的 fork 和回调进程”。 - Michael Tomkins
screen -ls 返回什么? - pawel7318
@Coder256 你实际上想要实现什么?也许有一种更简单的方法来实现你的目标... - Ralf
根据您想要实现的目标,也许 tmux 可以帮助您。 - Prem
显示剩余6条评论
1个回答

1
如果您使用-Dm运行screen,它将不会返回命令行提示符("no fork"思想;如果没有"&",这就是为什么它在Java退出之前不做任何事情)。如果您使用-dm运行它,则会立即返回到命令行提示符。
通过将-Dm放在后台,您已经导致它分叉并设置$!为您的screen进程的PID。所以这很好。
您正在设置screen的oom-priority(我怀疑您想要这样做;我认为您的目标是Java)。您可以像这样获取子进程的PID:
pidchild=$(pgrep -P $PID)

你真的想在屏幕退出后启动 startserver_after 吗?也许你还想等待子进程,使用 wait

关于最后的 screen -r:它应该可以工作,除非你的脚本没有 tty 作为标准输入,或者 Java 已经退出。在 screen -r 后立即尝试运行 ps -p $pidchild,看看子进程是否仍然存在。同时在脚本的最后运行 tty 命令,并确保它不返回 Not a tty


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接