Java 如何在运行时更新bash脚本或轻松重新启动它?
我需要一种方法来轻松地重新启动/替换bash脚本,而无需再次手动停止/启动该过程 以下是我当前脚本的工作方式:Java 如何在运行时更新bash脚本或轻松重新启动它?,java,bash,sh,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"
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”,我需要一种更简单的方法来替换正在运行的脚本
脚本本身将在游戏停止时下载更新的脚本(因此它将自动重新启动)
如何使脚本从内存中卸载自己,并使用新脚本
如果我不能做到这一点,您有什么替代方法可以建议吗?替代方法是使用过程监控工具,如、、等 对于其中任何一个,您只需编写以下脚本:
#!/bin/sh
exec java -server -Xms2G -jar game.jar nogui
…并且监控工具将负责在退出时重新启动服务器,在每次需要运行脚本时重新读取脚本(从而响应更新)
这些工具为您提供的功能远不止可靠的重启——它们通常还管理日志记录、阶段性关闭(即TERM+timeout+KILL)、自定义清理命令、信号挂钩等
另见
如果您不能使用流程管理系统(而且您真的、真的应该!),您可以使用脚本exec本身。也就是说:
#!/bin/sh
# ...do stuff here...
exec "$0" "$@" # and restart
请注意,由于各种原因,这是不可靠的。调用以下文件
myscript.sh
。每次游戏停止时,它都会重新加载到内存中:
#!/bin/sh
java -server -Xms2G -jar game.jar nogui
exec /path/to/myscript.sh
通过:1.sh:#!/bin/sh,而true do./2.sh done;2.sh:echo“1”我可以修改2.sh,1.sh将重新加载到内存中。@DogeCode,上面的exec“$0”“$@”
几乎是你的另一个问题需要回答的唯一问题。请注意,如果使用,它会更可靠${BASH_SOURCE:-$0}“
而不是$0
,以使用更准确的BASH_SOURCE
变量(如果可用)(也就是说,如果使用的shell是BASH)。请参阅$0
中的限制。顺便说一句,如果您没有删除其他问题,我们可以在其评论中继续讨论,如果要将其编辑为明确的问题,我们可能会重新打开它。