如何在运行时轻松更新bash脚本或轻松重启?

时间:2014-02-09 03:47:37

标签: java bash sh

我需要一种方法来轻松重启/替换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”',我需要一种更简单的方法来替换正在运行的脚本。

当游戏停止时,脚本本身将下载更新的脚本(因此它将自动重新开始。

如何让脚本从内存中卸载脚本并使用新脚本?

如果我不能这样做,你能提出其他方法吗?

2 个答案:

答案 0 :(得分:1)

替代方法是使用流程监督工具,例如runitdaemontoolsupstartsupervisordsystemd等。

对于其中任何一个,您只需编写以下脚本:

#!/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