私が望むもの:watchコマンドを使用してyコマンドを実行し、コマンドyの出力が変更された場合にのみwatchコマンドを更新します。
3行のエコー出力を持つbashスクリプトを想像してください。
Hello world!
Hello universe!
Aloha multiverse!
Bashスクリプトを監視したいが、スクリプトを編集して保存した結果(したがって修正日)、その出力が変更された場合にのみ更新が発生する必要があります。
通常と同様に、デフォルトで2秒ごとに更新されるwatchコマンドを1日に複数時間実行すると、ストレージディスクの寿命が短すぎるのを心配します。私は、このコマンドがどれだけの読み書き操作を生成するかを想像してみてください。これは本当に無駄だと思います。 watch コマンドは単に sleep し、watch コマンドを保存する動作で watch を起動し、スクリプトを再実行し、再度 sleep する方が良いでしょう。
私の言葉は:私たち全員が手で知っているものと自動的に同じであるということです。 1. スクリプトを作成し、2. 次に保存し、3. 次に再実行して、保存された変更が期待どおりに実行されることを確認します。繰り返します。変更を確認するために、コマンドを2秒ごとに実行せず、イベントに応じて一度だけ実行することを意味します。
スクリプトの作成とスクリプトの実行の間の退屈で継続的な移行を自動化するコストは、読み取りおよび書き込みプロセスの過度の増加のためにストレージディスクの寿命を使い果たす不可避の継続的な間隔更新ですか?
妥協点は、-nオプションを介して間隔を延長することです(例:30秒ごと)。しかし、watchコマンドはどういうわけかより良いことはできませんか?
私は、ファイルが変更されたときに-gオプションを使用して時計を終了することを検討しましたが、時計で何も変更されず、2秒ごとにまたは変更が発生するまで何でも読み取られ、ストレージディスクを使い続けます。
whileループにも同じ問題があります。そうですか?それともこれが解決策かもしれません。 whileループを使用してwatchコマンドを再構築して、真のイベントベース(?)にし、スクリプトを開発するときに読み書き操作の量を最小限に抑えることができますか?
効率性、ミニマリズム、できるだけ省資源に関するものです。
答え1
を使用する代わりにをwatch
使用してくださいinotifywait
。これはLinux用に作成されました。アイノード通知ファイルシステムの変更を観察するためのイベントベースのAPIを提供するカーネルサブシステム。
Ubuntuでは、このinotify-tools
パッケージinotifywait
には、特にファイル、ディレクトリ、またはファイルシステム全体で動作できるさまざまなガジェットが用意されています。
したがって、(bashで)次のことができます。
while true; do
diff <(./watchee) <(inotifywait -qqe modify ./watchee; ./watchee)
done
または以下を使用してくださいwatch
(引用符付きセミコロンを参照)。
watch inotifywait -qqe modify ./watchee';' ./watchee
そして、時計が見逃した間隔に追いつくために多くのコマンドを生成しないことを願っています。BUGS
マニュアルページのセクションに示すように、これは場合によっては発生することがあります。