有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要一种方法来轻松地重新启动/替换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) 个答案

  1. # 1 楼答案

    另一种方法是使用过程监督工具,如runitdaemontoolsupstartsupervisordsystemd

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

    #!/bin/sh
    exec java -server -Xms2G -jar game.jar nogui
    

    。。。监督工具将负责在退出时重新启动服务器,每次需要运行脚本时都重新读取脚本(从而响应更新)

    这些工具提供的功能远不止可靠的重启,它们通常还可以管理日志记录、分阶段关机(即TERM+timeout+KILL)、自定义清理命令、信号挂钩等

    另见ProcessManagement page on the freenode #bash wiki


    如果你不能使用流程管理系统(你真的应该这么做!),你可以让脚本自己执行。也就是说:

    #!/bin/sh
    # ...do stuff here...
    exec "$0" "$@" # and restart
    

    请注意,由于与BashFAQ #28相关的各种原因,这是不可靠的

  2. # 2 楼答案

    调用以下文件myscript.sh。每次游戏停止时,它都会将自己重新加载到内存中:

    #!/bin/sh
    java -server -Xms2G -jar game.jar nogui
    exec /path/to/myscript.sh