これは私のスクリプトです。
$ 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
-x
watch
sh -c 'pgrep -f tomcat'
watch
sh
watch -x pgrep -cf '[t]omcat'
[t]omcat
パターン自体が一致しないため、この状況を回避できます。
(そうでない場合は、-x
次のようにする必要があります。
watch 'pgrep -cf "[t]omcat"'
同様にシェルはワイルドカードなので、シェルと[x]
実行中のシェルの両方でwatch
エスケープする必要があります。)
vi tomcat.conf
もちろん、実行中のプロセスやatomcatalog
。コマンドラインベースの一致プロセスは非常に脆弱です。pgrep
より多くのオプションを追加して、フィルタを具体化し、誤ったプロセスを識別するリスクを制限することができます。
最新のLinuxシステムでは、制御グループに依存するか、その情報を照会できる必要がありますsystemd
(tomcat
サービスとして正しく設定されている場合)。
答え2
./count_tomcat.sh
スクリプトを「一般的に」実行すると、新しいbashプロセスは作成されず、現在のbashプロセスで実行されていることがわかりました。したがって、出力にはこのスクリプトの新しいエントリはありませんps
。
ウォッチを介して実行すると、スクリプトを引数として使用して新しいbashプロセスが作成されます。スクリプト自体がps
出力に表示されます。だからps
と注意してくださいwatch
。
2番目の問題:ps
「一般」bashスクリプトでコマンドを実行すると、「スクリプトとして実行中」であることがわかり、完全な出力が実行されます。
ps
commandで実行されているスクリプトからコマンドを実行すると、TTY環境(スクリプト内など)にないことがわからないため、出力サイズを正確に80に切り捨てますwatch
。ps
何か問題があります。修正:(ps -ww
無限幅)iffを使用して時計内で実行します。たぶん別の方法があるかもしれません。奇妙な。
set -x
スクリプトに追加するのに便利です。