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
欠点は、このバージョンではコマンドを直接実行する必要がなく、標準の通知のみを受信できることです。コマンドを明示的に実行し、ファイル/ディレクトリを無期限に監視するには、同様のアプローチを使用できます(-q
uietモードを使用)。
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") &
他のプロセスが端末自体を構成できるため、干渉が発生する可能性があります。