出于学习目的,我希望更改这样的不间断脚本:
#!/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...
以下是我的问题:
我猜对了吗?如果是这样,我可以更改某种系统变量以关闭缓冲并使其工作吗?
上面的代码只能运行一次,当我再次将脚本更改为echo 3 >> /tmp/log
和kill -HUP
时,它不会按预期输出3
,为什么
全部谢谢!
答案 0 :(得分:1)
您无法更改或重新加载正在运行的脚本(除非您exec $0
)。我认为你应该做的是使用两个脚本(或二进制文件):
这样,外部的启动脚本将执行脚本的最新版本,而不是它已缓存的内容。
H-O-W-E-V-E-R ...
你可以完全做其他事情。在大多数系统上,有一个名为cron
的守护程序/服务,它通过配置文件中设置的固定计划执行命令。您可以删除第二个脚本,并让cron每隔很多秒运行一次(可能更改的)脚本。
这并非完全无足轻重,因为cron的分辨率通常是几分钟,但看看这个问题: