背景「監視」に変更時にコマンドを実行させる方法

背景「監視」に変更時にコマンドを実行させる方法

watch特定のコマンドやファイル(たとえばw)に使用し、バックグラウンドで実行し、変更を通知したいと思います。私は以下を試しました:

(watch -g cat tmp && echo "changed") &

ただし、内容を変更すると、何も起こらずにtmp前景watchにインポートしたときにのみ終了しますfg

watchこれをバックグラウンドで実行し、変更を通知する方法はありますか?

答え1

簡単な方法はinotifywaitモニター-mモードを使用することです。つまり、最初に記録されたイベント以降に終了するのではなく、永遠に実行することです。監視するファイル/ディレクトリの変更などの通気孔を指定したり、-e開く、アクセス、書き込みなどのすべてのイベントを表示したりしません。man inotifywait可能なイベントの詳細については、リソースをご覧ください。

$inotifywait -m -e modify tmp &
$echo 1 >> tmp
tmp MODIFY

欠点は、このバージョンではコマンドを直接実行する必要がなく、標準の通知のみを受信できることです。コマンドを明示的に実行し、ファイル/ディレクトリを無期限に監視するには、同様のアプローチを使用できます(-quietモードを使用)。

while ((1)) ; do \
   inotifywait -q -e modify tmp && echo "tmp was changed" \
done &

答え2

watchあなたが望むもののために設計されていません。

ある時点でwatch端末を再構成してみてください。バックグラウンドでSIGTTOUを取得そして止めなさい。フルジョブはSIGTTOU信号を受信します。

ジョブ制御機能を備えた対話型シェルでは、jobs今後の呼び出しでこれを確認できます。にzshコメントが表示されますsuspended (tty output)jobsこの程度の情報は、他のシェルでは提供されない場合があります。

私のテストでは、stdoutとstderrを端末から離れてリダイレクトする必要があります。

(watch -g cat tmp >/dev/null 2>&1 && echo "changed") &

端末の元の設定に含まれている場合は、tostop書き込みechoを試みるとSIGTTOUがトリガされます。stty -tostop設定でecho端末への印刷を許可するかどうかを事前に実行して確認してください。

stty -tostop; (watch -g cat tmp >/dev/null 2>&1 && echo "changed") &

他のプロセスが端末自体を構成できるため、干渉が発生する可能性があります。

関連情報