我需要一种方法来轻松重启/替换bash脚本,而无需再次手动停止/启动该过程。
以下是我当前脚本的工作原理:
#!/bin/sh
while true
do
echo "1"
java -server -Xms2G -jar game.jar nogui
done;
基本上,如果游戏停止,它将自动重启,但是脚本已经加载到内存中,所以如果我要修改它,我将不得不手动终止脚本并再次启动它以便更改生效。我正在运行游戏服务器本身的至少200个实例,所以手动执行此操作并杀死是不明智的,然后再次手动启动每个脚本。
当游戏服务器停止时,我希望它能够更新脚本,以下是我可能想要做的一个例子:
#!/bin/sh
while true
do
echo "1"
echo "2"
java -server -Xms2G -jar game.jar nogui
done;
但是,我需要自己停止脚本并自己重新启动它,以便添加新的'echo“2”',我需要一种更简单的方法来替换正在运行的脚本。
当游戏停止时,脚本本身将下载更新的脚本(因此它将自动重新开始。
如何让脚本从内存中卸载脚本并使用新脚本?
如果我不能这样做,你能提出其他方法吗?
答案 0 :(得分:1)
替代方法是使用流程监督工具,例如runit,daemontools,upstart,supervisord,systemd等。
对于其中任何一个,您只需编写以下脚本:
#!/bin/sh
exec java -server -Xms2G -jar game.jar nogui
...并且监督工具将负责在退出时重新启动服务器,每次需要运行时重新读取脚本(从而响应更新)。
这些工具为您提供的功能远远多于可靠的重启功能 - 它们通常还可以管理日志记录,分阶段关闭(即TERM +超时+ KILL),自定义清理命令,信号挂钩等。
另请参阅ProcessManagement page on the freenode #bash wiki。
如果您不能使用流程管理系统(而且您确实应该!),您可以让脚本执行。也就是说:
#!/bin/sh
# ...do stuff here...
exec "$0" "$@" # and restart
请注意,由于与BashFAQ #28相关的各种原因,这是不可靠的。
答案 1 :(得分:0)
调用以下文件myscript.sh
。每次游戏停止时它都会重新加载到内存中:
#!/bin/sh
java -server -Xms2G -jar game.jar nogui
exec /path/to/myscript.sh