【发布时间】:2012-11-13 18:04:15
【问题描述】:
我使用 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
)
【问题讨论】:
-
您能告诉我们对
system/exec/etc 的调用不起作用吗? -
基本上$LINE用php执行的时候好像是空的,所以watcher.php脚本中自然有argv
-
让我澄清一下。您能否将调用复制并粘贴到
system和/或passthru,在其中调用inotifywait二进制文件? -
已更新 - passthru("inotifywait -e close_write --format '%w%f' -m -r /path/do/dir | while read LINE; do php /home/scripts/watcher. php $LINE; 完成");
标签: php inotify inotifywait