3

ファイルシステムで特定のイベントがいつ発生したかを知るために、inotify-tools を使用して一部のデータを処理する bash スクリプトがあります。bash コンソールで実行すると問題なく動作しますが、デーモンとして実行しようとすると失敗します。その理由は、inotifywaitコマンド呼び出しからのすべての出力がファイルに送られるため、後の部分| whileが呼び出されなくなったためだと思います。どうすれば修正できますか?これが私のスクリプトです。

#!/bin/bash

inotifywait -d -r \
-o /dev/null \
-e close_write \
--exclude "^[\.+]|cgi-bin|recycle_bin" \
--format "%w:%&e:%f" \
$1|
while IFS=':' read directory event file
do

    #doing my thing

done

したがって、デーモンとして実行するように-d指示し、再帰的に実行し、出力を保存するファイルです。私の場合、ファイルは、コマンドの後の部分を処理することを除いて、実際には出力が必要ないためです( )inotifywait-r-o/dev/null| while...

4

2 に答える 2

9

inotify-waitこの場合、コマンドからのプロセス出力を続行したいので、デーモンとして実行したくありません。-dコマンド ライン オプションをに置き換えます。これにより、ファイルの監視を継続し、 への印刷を続行するよう-mに指示されます。inotifywaitstdout

   -m, --monitor
          Instead  of exiting after receiving a single event, execute
          indefinitely.  The default behaviour is to exit  after  the
          first event occurs.

バックグラウンドで実行したい場合は、スクリプト全体をバックグラウンドにする必要があります。

于 2012-05-10T11:53:54.050 に答える
2

nohup を使用した解決策は次のとおりです: (私のテストでは、-o を指定した場合、while ループが評価されていないように見えることに注意してください)

nohup inotifywait -m -r \
  -e close_write \
  --exclude "^[\.+]|cgi-bin|recycle_bin" \
  --format "%w:%&e:%f" \
  $1 |
while IFS=':' read directory event file
do
  #doing my thing
done >> /some/path/to/log 2>&1 &
于 2012-12-12T22:23:42.133 に答える