新しく孤立したPIDをどのように検出して警告しますか?特定のユーザーに対して1日1回孤児pid(PPID = 1)を確認し、新しい孤立プロセスが検出された場合にのみ警告を発するスクリプトをcronしたいと思います。
例えば、ps -efa は、「user」の孤立した pid を見つけるために grepping を出力します。
初日
user 1111111 1 0 Dec 18 - 0:00 command <--- send email about this pid
翌日
user 1111111 1 0 Dec 18 - 0:00 command
user 2222222 1 0 Dec 14 - 0:00 command <--- send email about this pid
答え1
1.孤児検索、2.新しい孤児が見つかったら警告を設定します。
1.孤児の発見
次のように起動できます。
ps -eo pid,ppid,ruser,stat,command
ここにリストされている5つの出力(pid、ppid、ruser、stat、command)のタイトルとともに、すべてのプロセスを一覧表示するテーブルが提供されています。これらの5つの出力フィールドSTANDARD FORMAT SPECIFIERS
の説明については、セクションを参照してくださいman ps
。
連続出力パイプをgrep
使用してリストをフィルタリングしたり、awk
必要なプロセスをより効率的にキャプチャしたりできます。
ps -eo pid,ppid,ruser,stat,command | awk '{ if ($2 == 1 && $3 == "pi") print $0 "\n";}'
926 1 pi Ss /lib/systemd/systemd --user
ここでは、出力のすべてのラインの全体のライン/レコードが印刷されますawk
()。$0
ps
もし2番目のフィールド($2
)ppid
の値は1
、そして3番目のフィールド($3
)はユーザーの文字列(pi
この場合)です。私のシステムで実行すると、上記の結果が表示されます。
しかし今は狡猾なstat
... AFAIK、フィールド自体に識別する値はありません。幼児プロセス、つまり親プロセスは終了しましたが、init
このプロセスによって採用されました。つまり、対応するプロセスはpid
1 です。PROCESS STATE CODES
セクションを確認して、man ps
そのフィールドの可能な値を確認できますstat
。値は「ジ「はゾンビプロセスを意味します。これは孤児と似ていますが違います。。
通常ps
、プロセスが孤立しているかどうかを明示的に知る方法がないため、上記のコマンドの出力を次のように処理する必要があります。容疑者リストさらなる調査を待っています。
ユーザーとシステムに応じて、次のことができます。入らないようにするstat
一部の手順はコードまたはcommand
フィールドの値に基づいています。たとえば、上記のコマンドは=(systemd
)でプロセスを見つけました。このプロセスは孤児ではありません。 AFAICT、上記のコマンドで出力された5つのパラメータは、目標を達成するための合理的な基盤を提供します。stat
Ss
ps
2. 新しい孤児が発見された場合の警告設定
以下をお勧めします方法通知設定の使用孤児の検出上記のステップ1のコマンドです。
2 つのファイルが使用されます:OrphansOfRecord
とOrphansOfTheDay
OrphansOfTheDay は次のように生成されます。
ps -eo pid,ppid,ruser,stat,command | awk '{ if ($2 == 1 && $3 == "pi") print $0 "\n";}' > OrphansOfTheDay
作成されると、の各行はOrphansOfTheDay
の各行と比較されますOrphansOfRecord
。つまり、次の各行についてOrphansOfTheDay
:
- 行がで見つからない場合は、
OrphansOfRecord
新しい孤立行になり、警告が設定されます。 - 新しい孤児がなければ、アラームは設定されません。つまり、孤児が消去されてもアラームは発生しません。
新しい孤児プロセスは次のように定義されます。
- これは
pid
新しいものですまたはこれはcommand
新しいものです
awk 'NR == FNR{a[$5]b[$1];} !($5 in a)||!($1 in b){print "ALERT" > "alertfile"; close ("alertfile")}' OrphansOfRecord OrphansOfTheDay
このawk
コマンドを解析します。
NR == FNR
は状況inawk
- TRUE と評価される条件最初のファイルパラメーターにリストされている内容を読んでいます。OrphansOfRecord
この場合です。最初のファイルを読み取った後、条件はFALSEと評価されます。NR == FNR
これは本当だが、行動{a[$5]b[$1];}
処刑される。このアクションは、それぞれ配列の各行のフィールド$5
(command
)と()の値を格納します。$1
たとえば、ファイルに3行(またはレコード)がある場合、&にはこのコマンドが完了したときに3つの要素がそれぞれ含まれます。pid
OrphansOfRecord
a
b
OrphansOfRecord
a
b
OrphansOfRecord
のすべての行を読み取った後、NR == FNR
falseになり、awk
2番目のファイルを読み始めますOrphansOfTheDay
。OrphansOfTheDay
最初の行を読んだ後、2行目を読んでください。状況次のように評価されます!($5 in a)||!($1 in b)
。この条件は、$5
行の値を配列の値と比較しa
、$1
同じ行の値を配列の値と比較しますb
。ご注意ください、状況テスト矛盾$5
のa
またはㅏマッチ.$1
b
awk
これにより、各行のテストが続行されますOrphansOfTheDay
。 2回目は状況本当です、第二行動実行済み:{print "ALERT" > "alertfile"; close ("alertfile")}
ジョブがまだ存在しない場合は、ジョブをalertfile
リダイレクトして閉じて、出力バッファがフラッシュされていることを確認してください。print "ALERT"
alertfile
「警告」出力を使用して、新しい疑わしい孤児が見つかったことを示します。 「警告」の存在または内容をalertfile
使用して、電子メールを送信するかどうかを決定できます。
この時点でOrphansOfTheDay
処理が完了し、疑わしい孤児が見つかると、「警告」が生成されます。まだやるべき2つのことがあります。
- 次のアドレスに手紙を書く
OrphansOfTheDay
:OrphansOfRecord
mv OrphansOfTheDay OrphansOfRecord
- 「警告」が設定されると、メールが送信され
alertfile
消去されます。
if [ -e alertfile ]
then
mail -s "ALERT: NEW ORPHAN FOUND" pi < OrphansOfRecord
rm alertfile
fi
クリスマスが近づいていますが、まだ時間がない日が数日残りました。すぐにスクリプトを作成します。それとも直接続けることもできます。