我想要什么:使用 watch 命令运行命令 y,并且仅在命令 y 的输出发生更改时才更新 watch 命令。
想象一个带有 3 行 echo 输出的 bash 脚本
Hello world!
Hello universe!
Aloha multiverse!
我希望监视 bash 脚本,但只有当所述输出由于编辑脚本并随后保存而发生更改(因此修改日期)时,才应该发生更新。
我担心,像往常一样,默认情况下每 2 秒更新一次的 watch 命令,每天运行多个小时时,会过快地缩短存储磁盘的使用寿命。我的意思是,想象一下该命令会产生多少读/写操作。我觉得这样太浪费了。如果 watch 命令只是休眠,保存监视命令的行为会唤醒 watch,再次运行脚本,然后再次休眠,那就更好了。
我的意思是:自动相当于我们都知道的手工操作:1. 编写脚本,2. 然后保存它,3. 然后再次执行它以查看保存的更改是否按预期运行 - 重复。我的意思是为了看到变化,我们不会每 2 秒执行一次命令,而是基于事件只执行一次。
在编写脚本和执行脚本之间进行自动化的繁琐的不断切换的代价是否是不可避免的不断的间隔更新会因读写进程的过度增长而耗尽存储磁盘的寿命?
折衷方案可能是通过 -n 选项来延长间隔时间,例如每 30 秒一次,但 watch 命令无法以某种方式做得更好吗?
我的意思是,我已经考虑过,一旦文件发生更改,就可以让 watch 通过 -g 选项退出,但这不会改变 watch 上的任何内容,导致每 2 秒或其他间隔进行一次读取操作,直到发生更改,保持存储磁盘一直处于繁忙状态。
while 循环也有同样的问题,不是吗?或者这可能是解决方案:用 while 循环重建 watch 命令,使其真正基于事件(?),从而在开发脚本时最大限度地减少读写操作量?
这是关于效率、极简主义、尽可能节省资源。
答案1
与其使用watch
,不如使用inotifywait
。这是针对 Linux 构建的索引节点通知内核子系统,它提供基于事件的API来观察文件系统的变化。
在 Ubuntu 上,该inotify-tools
软件包提供了inotifywait
以及各种其他可对文件、目录或整个文件系统进行操作的小工具。
所以,你可以这样做(在 bash 中):
while true; do
diff <(./watchee) <(inotifywait -qqe modify ./watchee; ./watchee)
done
或者,使用watch
(注意带引号的分号):
watch inotifywait -qqe modify ./watchee';' ./watchee
并希望手表不会产生一堆命令来赶上错过的时间间隔 - 正如BUGS
其手册页中的部分所暗示的那样,在某些情况下可能会发生这种情况。