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スクリプトに2番目の引数が渡されません。 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 に答える