如何更改和重新加载正在运行的shell脚本?

时间:2018-03-09 10:14:27

标签: linux bash shell

出于学习目的,我希望更改这样的不间断脚本:

#!/bin/env bash

while true; do
        sleep 3

        echo 1 >> /tmp/log
done

我知道Linux会将最近的文件加载到内存中,所以我猜这就是我不能简单地将echo 1 >> /tmp/log更改为echo 2 >> /tmp/log并保存脚本的原因看到结果。

所以我改变了剧本:

#!/bin/env bash

CMD="$0 $@"
handleSigHup() {
        echo "Receive single SIGHUP, reloading..."
        exec $CMD
}

trap 'handleSigHup' SIGHUP

while true; do
        sleep 3

        echo 2 >> /tmp/log
done

现在我可以使用kill -HUP查看 / tmp / log 输出:

1
1
1
2
2
2
2...

以下是我的问题:

  1. 我猜对了吗?如果是这样,我可以更改某种系统变量以关闭缓冲并使其工作吗?

  2. 上面的代码只能运行一次,当我再次将脚本更改为echo 3 >> /tmp/logkill -HUP时,它不会按预期输出3,为什么

  3. 全部谢谢!

1 个答案:

答案 0 :(得分:1)

您无法更改或重新加载正在运行的脚本(除非您exec $0)。我认为你应该做的是使用两个脚本(或二进制文件):

  • 实际完成工作的一个脚本,可能会被重写
  • 另一个运行每个固定时间段的脚本,并执行第二个脚本

这样,外部的启动脚本将执行脚本的最新版本,而不是它已缓存的内容。

H-O-W-E-V-E-R ...

你可以完全做其他事情。在大多数系统上,有一个名为cron的守护程序/服务,它通过配置文件中设置的固定计划执行命令。您可以删除第二个脚本,并让cron每隔很多秒运行一次(可能更改的)脚本。

这并非完全无足轻重,因为cron的分辨率通常是几分钟,但看看这个问题:

How to get a unix script to run every 15 seconds?