watchコマンドは、スクリプトのみを実行したときとは異なるps結果を表示します。

watchコマンドは、スクリプトのみを実行したときとは異なるps結果を表示します。

これは私のスクリプトです。

$ cat count_tomcat.sh 
ps -ef | grep tomcat| wc -l
$ ./count_tomcat.sh 
2

これwatchでコマンドを使用すると、他の結果が表示されます。

$ watch ./count_tomcat.sh


Every 2.0s: ./count_tomcat.sh                                                                                                                                                                                Fri Oct 15 16:50:43 2021

5

答え1

速く走る:

watch -x pgrep -c -f tomcat

定期的にコマンドラインにインクルードをインポートしますtomcat

または

watch -x pgrep -c -x tomcat

ps -e名前によるプロセスに関する情報(コマンドラインではない、wrt出力のようにps -efはいスコー洋。

または:

watch -x pgrep -c -u tomcat

ユーザーとして実行されるプロセスの数(一致する出力列がtomcatわからないため)。ps -ef

の場合、-x少なくともprocps-ng実装のためにwatchシェル実行をスキップし、代わりにコマンドを直接実行します。

pgrep -f tomcat(コマンドラインに含まれていても)それ自体は報告しませんが、コマンドを計算してtomcatコマンドに追加しません。これは、実装が最後のコマンドの分岐を最適化しない場合にコマンドラインを解析するために呼び出すことができます。 。watch-xwatchsh -c 'pgrep -f tomcat'watchsh

watch -x pgrep -cf '[t]omcat'

[t]omcatパターン自体が一致しないため、この状況を回避できます。

(そうでない場合は、-x次のようにする必要があります。

watch 'pgrep -cf "[t]omcat"'

同様にシェルはワイルドカードなので、シェルと[x]実行中のシェルの両方でwatchエスケープする必要があります。)

vi tomcat.confもちろん、実行中のプロセスやatomcatalog。コマンドラインベースの一致プロセスは非常に脆弱です。pgrepより多くのオプションを追加して、フィルタを具体化し、誤ったプロセスを識別するリスクを制限することができます。

最新のLinuxシステムでは、制御グループに依存するか、その情報を照会できる必要がありますsystemdtomcatサービスとして正しく設定されている場合)。

答え2

./count_tomcat.shスクリプトを「一般的に」実行すると、新しいbashプロセスは作成されず、現在のbashプロセスで実行されていることがわかりました。したがって、出力にはこのスクリプトの新しいエントリはありませんps

ウォッチを介して実行すると、スクリプトを引数として使用して新しいbashプロセスが作成されます。スクリプト自体がps出力に表示されます。だからpsと注意してくださいwatch

2番目の問題:ps「一般」bashスクリプトでコマンドを実行すると、「スクリプトとして実行中」であることがわかり、完全な出力が実行されます。

pscommandで実行されているスクリプトからコマンドを実行すると、TTY環境(スクリプト内など)にないことがわからないため、出力サイズを正確に80に切り捨てますwatchps何か問題があります。修正:(ps -ww無限幅)iffを使用して時計内で実行します。たぶん別の方法があるかもしれません。奇妙な。

set -xスクリプトに追加するのに便利です。

関連情報