我有一个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...
)
答案 0 :(得分: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.
如果您希望在后台运行内容,则需要对整个脚本进行后台处理。
答案 1 :(得分:1)
这是使用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 &