我有一个游戏服务器。它通过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的屏幕将停止。但不是:(
有什么想法吗?
答案 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