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

Posted

技术标签:

【中文标题】使用 php 执行时 inotifywait 不会传递 args【英文标题】:inotifywait won't pass args when executed with php 【发布时间】: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; 完成"); 【参考方案1】:

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

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。

【讨论】:

以上是关于使用 php 执行时 inotifywait 不会传递 args的主要内容,如果未能解决你的问题,请参考以下文章

Inotifywait 用于大目录

`inotifywait` 不会在带有 `-e delete_self` 的 bash 脚本中终止;但在交互式外壳中

“inotifywait -e close_write”即使尾巴显示新行也不会触发

inotifywait shell 脚本作为守护进程运行

inotifywait 未在 bash 脚本中执行 while 循环

通过 FTP 将文件添加到 git 存储库时,在脚本中使用 inotifywait 自动执行 git 提交