Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用inotify工具作为守护进程处理数据_Linux_Bash_Shell_Inotify Tools - Fatal编程技术网

Linux 使用inotify工具作为守护进程处理数据

Linux 使用inotify工具作为守护进程处理数据,linux,bash,shell,inotify-tools,Linux,Bash,Shell,Inotify Tools,我有一个bash脚本,它使用inotify工具处理一些数据,以了解文件系统上何时发生了某些事件。如果在bash控制台中运行,它可以正常工作,但是当我尝试将其作为守护进程运行时,它失败了。我认为原因在于inotifywait命令调用的所有输出都会进入一个文件,因此,| while之后的部分不再被调用。我怎样才能解决这个问题?这是我的剧本 #!/bin/bash inotifywait -d -r \ -o /dev/null \ -e close_write \ --exclude "^[\.+

我有一个bash脚本,它使用inotify工具处理一些数据,以了解文件系统上何时发生了某些事件。如果在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…

在这种情况下,您不希望将
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.

如果希望在后台运行,则需要对整个脚本进行后台处理。

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


等一下,我知道,但我需要它在后台运行,这样我就可以关闭控制台、注销等,它仍然可以监视我的目录。这就是我所说的“将整个脚本后台化”。您需要使脚本作为守护进程运行,而不仅仅是
inotifywait
程序。但手册页上说“-d,-daemon与--monitor相同,只是在后台运行,将事件记录到必须由--outfile.Implies--syslog指定的文件中。“@ChrisF,这将使后台
inotifywait
本身,但是如果你要把它的输出管道化到一个脚本中,那就没有任何意义了。这是行不通的。他的循环依赖于事件发生时inotifywait被中断。这在-m中永远不会发生。他应该将inotifywait命令放在某种循环中,与他想要执行的任何命令一起执行。这将允许它在没有-m或-d的情况下持续存在。为什么?
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 &