1

我使用 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() 函数中时,为了将其作为带有主管的守护程序运行,它不会将第二个参数传递给通常包含绝对路径的 watcher.php 脚本触发 inotifywait 的文件。

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

当执行包装脚本时,为了观察文件夹,它给出了 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
)
4

1 回答 1

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

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

您需要切换到单引号并明智地使用转义来处理命令中使用单字的位,或者如果您使用的是 5.3 或更高版本,则需要切换到nowdoc 。

于 2012-11-13T19:47:51.033 回答