使用php执行时,inotifywait不会传递args

时间:2012-11-13 18:04:15

标签: php inotify inotifywait

我使用inotifywait来查看新文件的文件夹,并在检测到“close_write”时将文件的路径发送到php脚本来处理它。

命令如下所示:

inotifywait -e close_write --format '%w%f' -m -r /path/do/dir | while read LINE; do php /home/scripts/watcher.php $LINE; done

当它在ssh中执行时,它完美地运行。当我将它包装在php中的exec()或system()函数中时,为了将其作为带有管理程序的守护程序运行,它不会将第二个arg传递给通常包含绝对路径的watcher.php脚本。触发inotifywait的文件。

exec()甚至根本不触发脚本,而passthru()和system()实际上命中了watcher.php但没有第一个之外的args,其中包含脚本本身的路径。

当执行包装器脚本时,为了观察文件夹,它给出了来自ionotifywait的输出:

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

上传新文件时,没有任何反应。 watcher.php没有被触发。

当我使用passthru()或system()并上传文件时,它会点击watcher.php,它会在文件顶部执行此操作:print_r($argv);

passthru("inotifywait -e close_write --format '%w%f' -m -r /path/do/dir | while read LINE; do php /home/scripts/watcher.php $LINE; done");

这只输出

Array (
       [0] => /home/scripts/watcher.php 
)

如果我手动在cli中运行ionotifywait命令,它会在上传新文件时打印预期的输出

Array
(
    [0] => /home/scripts/watcher.php
    [1] => /path/to/dir/hello.jpg
)

1 个答案:

答案 0 :(得分:0)

所以,这是你的问题。你的电话是:

passthru("inotifywait -e close_write --format '%w%f' -m -r /path/do/dir | while read LINE; do php /home/scripts/watcher.php $LINE; done");

这些双引号正在插入$LINE,好像它是一个PHP变量。结果调用看起来像

inotifywait -e close_write --format '%w%f' -m -r /path/do/dir | while read LINE; do php /home/scripts/watcher.php ; done

...这就是为什么param实际上没有传递给watcher.php。

你需要切换到单引号并明智地使用转义为命令中使用单曲的位,或者如果你使用5.3或更高版本则转换为nowdoc