Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时更新bash脚本或轻松重新启动它?_Java_Bash_Sh - Fatal编程技术网

Java 如何在运行时更新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个游戏服务器实例,因此,手动执行此操作并杀死,然后再次手动启动每个脚本

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

脚本本身将在游戏停止时下载更新的脚本(因此它将自动重新启动)

如何使脚本从内存中卸载自己,并使用新脚本


如果我不能做到这一点,您有什么替代方法可以建议吗?

替代方法是使用过程监控工具,如、、等

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

#!/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
中的限制。顺便说一句,如果您没有删除其他问题,我们可以在其评论中继续讨论,如果要将其编辑为明确的问题,我们可能会重新打开它。