3

我有一个 bash 脚本,它使用 inotify-tools 处理一些数据,以了解文件系统上何时发生某些事件。如果在 bash 控制台中运行它可以正常工作,但是当我尝试将它作为守护程序运行时它会失败。我认为原因是inotifywait命令调用的所有输出都进入了一个文件,因此之后的部分| while不再被调用。我该如何解决?这是我的脚本。

#!/bin/bash

inotifywait -d -r \
-o /dev/null \
-e close_write \
--exclude "^[\.+]|cgi-bin|recycle_bin" \
--format "%w:%&e:%f" \
$1|
while IFS=':' read directory event file
do

    #doing my thing

done

所以,-d告诉inotifywait作为守护进程运行,-r递归地执行它并且-o是保存输出的文件。在我的情况下,该文件是/dev/null因为我真的不需要输出,除了处理命令之后的部分(| while...

4

2 回答 2

9

在这种情况下,您不想作为守护程序运行inotify-wait,因为您想继续处理命令的输出。您想用 替换-d命令行选项-m,它告诉inotifywait您继续监视文件并继续打印到stdout

   -m, --monitor
          Instead  of exiting after receiving a single event, execute
          indefinitely.  The default behaviour is to exit  after  the
          first event occurs.

如果您希望在后台运行,则需要将整个脚本置于后台。

于 2012-05-10T11:53:54.050 回答
2

这是使用 nohup 的解决方案:(请注意,在我的测试中,如果我指定了 -o,则似乎没有评估 while 循环)

nohup inotifywait -m -r \
  -e close_write \
  --exclude "^[\.+]|cgi-bin|recycle_bin" \
  --format "%w:%&e:%f" \
  $1 |
while IFS=':' read directory event file
do
  #doing my thing
done >> /some/path/to/log 2>&1 &
于 2012-12-12T22:23:42.133 回答