在现有屏幕中创建新的“屏幕”

时间:2018-04-08 16:48:54

标签: linux bash gnu-screen

我有一个游戏服务器。它通过dotnet在linux上运行。我在'屏幕'会话中运行它。 但是我正在努力重启这台服务器。 从外面看,很容易。我只是通过名称杀死现有屏幕并创建新屏幕。 但是当我想从内部重新启动服务器时(现有的游戏进程启动新进程,运行杀死命名屏幕的脚本并启动新的进程)

具体:

stop.sh:

screen -r gameserver -X quit

start.sh:

screen -L -A -m -d -S gameserver /usr/bin/dotnet /gameserver/game.dll

restart.sh:

/gameserver/stop.sh
/gameserver/start.sh

现在如果我从内部屏幕以编程方式运行restart.sh,它会调用stop.sh,它会终止当前屏幕以及这个restart.sh脚本,因此新的脚本不会启动。

我试图通过屏幕运行restart.sh:

screen -L -m -d /bin/bash -c /gameserver/restart.sh

但它仍然不起作用...... 我希望这会在新屏幕上运行restart.sh,其中'gameserver'屏幕将终止并启动新屏幕,然后运行restart.sh的屏幕将停止。但不是:(

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你不能在屏幕内杀死这个过程吗? 像

这样的东西

screen -r gameserver kill $(ps aux|grep 'game.dll'|awk '{print $2}')

答案 1 :(得分:0)

我想你可能不应该在屏幕内运行这样的脚本。杀死整个会话然后在屏幕内重新创建它有点奇怪。

在您的脚本 stop.sh 中,虽然使用 -r 并使用 -X 可能会有时工作,但这没有多大意义。我认为您应该使用 -S 而不是 -r

在屏幕外运行

如果您将 stop.sh 替换为screen -S gameserver -X quit,并在屏幕外运行 restart.sh ,则应该有效。

在屏幕内运行

但是,如果你真的需要在屏幕内运行它,你可以尝试杀死一个窗口,而不是终止整个会话。

stop.sh:

# Create a new window before kill 'server'
# Without this, the session will be terminated if 'server' is the only window
screen
screen -p server -X kill

start.sh:

# Are we in the 'gameserver' session?
if [ "${STY#*.}" = gameserver ]; then
    # Create a window named 'server' and run your program in it
    screen -t server /usr/bin/dotnet /gameserver/game.dll
else
    # Create a new screen session named 'gameserver' 
    # And it's default window is named 'server'
    # -T $TERM to make sure things such as '-t' work
    screen -L -A -m -d -S gameserver -t server -T $TERM /usr/bin/dotnet /gameserver/game.dll
fi