問題のサーバーで確実に実行されているにもかかわらず、ps -o args -p <pid>
コマンドが問題のプロセスを見つけることができない場合があるという奇妙な問題に遭遇しました。問題のプロセスは、一部のJavaアプリの起動に使用される長期実行ラッパースクリプトです。
問題の「野生」の出現は、常に早朝に起きているように見えるので、それは彼らは非常に重く、その後ロードされているので、問題になっているサーバ上のディスク負荷に近い関連といういくつかの証拠は、しかし、実行することで、そこにあるps
中をタイトなループで質問すると、最終的に問題を再現できます-数百回に1回実行するとエラーが発生します。
次のbashスクリプトを実行することで、失敗した実行と成功した実行の両方のstrace出力を生成できました。
while [ $? == 0 ] ; do strace -o fail.out ps -o args -p <pid> >/dev/null ; done ; strace -o good.out ps -o args -p <pid>
以下からの出力を比較するfail.out
とgood.out
、私はそれを見ることができますgetdents
何とか失敗し、実行上のシステムコールが(〜1100年と比較して〜500程度)システム上のプロセスの実際の数よりもはるかに小さい数を返します
grep getdents good.out
getdents(5, /* 1174 entries */, 32768) = 32760
getdents(5, /* 31 entries */, 32768) = 992
getdents(5, /* 0 entries */, 32768) = 0
grep getdents fail.out
getdents(5, /* 673 entries */, 32768) = 16728
getdents(5, /* 0 entries */, 32768) = 0
...そして、その短いリストには問題の実際のpidが含まれていないため、見つかりません。
このセクションは無視できます。ENOTTYエラーは、以下のdave_thompsonのコメントで説明されており、無関係です。
さらに、失敗した実行には
ENOTTY
、成功した実行では表示されないいくつかのエラーが発生します。私が見る出力の初め近くioctl(1、TIOCGWINSZ、0x7fffe19db310)= -1 ENOTTY(デバイスの不適切なioctl)ioctl(1、TCGETS、0x7fffe19db280)= -1 ENOTTY(デバイスの不適切なioctl)
そして最後に私はシングルを見ます
ioctl(1、TCGETS、0x7fffe19db0d0)= -1 ENOTTY(デバイスに不適切なioctl)
ioctl
最後の失敗はps
戻りの直前に発生しますがps
、空の結果セットがすでに出力された後に発生するため、それらが関連しているかどうかはわかりません。私が持っているすべての失敗したstrace出力でそれらが一貫していることは知っていますが、成功したものには表示されません。
getdents
プロセスの完全なリストが時々見つからない理由がまったくわかりません。今、ラッパースクリプトをチェックする制御スクリプトを変更するだけで、全体のバンドエイドを平手打ちにするところに到達しましたps
最初の1つが失敗した場合、2回目を呼び出す問題ですが、誰かがここで何が起こっているのか考えているかどうか知りたいです。
問題のシステムは、CentOS 7およびprocps-ngバージョン3.3.10-17.el7_5.2.x86_64でカーネル4.16.13-1.el7.elrepo.x86_64を実行しています。
>/dev/null
ので、(ループ内)の呼び出しではなく、「良い」の呼び出し、FD 1.上ENOTTYを「失敗」に