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

标签 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/log 并再次使用 kill -HUP 时,它成功了没有按预期输出 3,为什么?

谢谢大家!

最佳答案

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

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

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

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

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

这并不完全是微不足道的,因为 cron 的分辨率通常是几分钟,但看看这个问题:

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

关于linux - 如何更改和重新加载正在运行的 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49191408/

相关文章:

linux - syslogd 不理解控制台。* syslog.conf 中的规则错误 "syslogd: unknown facility name "控制台”

linux - chmod 不适用于 virtualbox 共享文件夹

linux - 如何从 Linux 发送文件到电子邮件?

bash - ps-ef | wc -l 将制表符添加到行的前面

shell - Ansible 任务从文件中删除数据

python - 通过 cron 从 bash 脚本内部运行 python 文件

linux - 为什么这个 ftp get 命令在我的 shell 脚本中工作但在 cron 中失败

php - 安装linux raspberry的mysql-server失败(没有剩余空间)

bash - 仅当重定向到管道或文件时 awk 才没有输出

linux - shell 脚本 : pacmd: no command found