新しい孤立したPIDを監視および警告するスクリプト

新しい孤立したPIDを監視および警告するスクリプト

新しく孤立した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()。$0psもし2番目のフィールド($2ppidの値は1そして3番目のフィールド($3)はユーザーの文字列(piこの場合)です。私のシステムで実行すると、上記の結果が表示されます。

しかし今は狡猾なstat... AFAIK、フィールド自体に識別する値はありません。幼児プロセス、つまり親プロセスは終了しましたが、initこのプロセスによって採用されました。つまり、対応するプロセスはpid1 です。PROCESS STATE CODESセクションを確認して、man psそのフィールドの可能な値を確認できますstat。値は「「はゾンビプロセスを意味します。これは孤児と似ていますが違います。

通常ps、プロセスが孤立しているかどうかを明示的に知る方法がないため、上記のコマンドの出力を次のように処理する必要があります。容疑者リストさらなる調査を待っています。

ユーザーとシステムに応じて、次のことができます。入らないようにするstat一部の手順はコードまたはcommandフィールドの値に基づいています。たとえば、上記のコマンドは=(systemd)でプロセスを見つけました。このプロセスは孤児ではありません。 AFAICT、上記のコマンドで出力された5つのパラメータは、目標を達成するための合理的な基盤を提供します。statSsps

2. 新しい孤児が発見された場合の警告設定

以下をお勧めします方法通知設定の使用孤児の検出上記のステップ1のコマンドです。

2 つのファイルが使用されます:OrphansOfRecordOrphansOfTheDayOrphansOfTheDay は次のように生成されます。

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状況in awk- TRUE と評価される条件最初のファイルパラメーターにリストされている内容を読んでいます。OrphansOfRecordこの場合です。最初のファイルを読み取った後、条件はFALSEと評価されます。

  • NR == FNRこれは本当だが、行動 {a[$5]b[$1];}処刑される。このアクションは、それぞれ配列の各行のフィールド$5command)と()の値を格納します。$1たとえば、ファイルに3行(またはレコード)がある場合、&にはこのコマンドが完了したときに3つの要素がそれぞれ含まれます。pidOrphansOfRecordabOrphansOfRecordab

  • OrphansOfRecordのすべての行を読み取った後、NR == FNRfalseになり、awk2番目のファイルを読み始めますOrphansOfTheDayOrphansOfTheDay最初の行を読んだ後、2行目を読んでください。状況次のように評価されます!($5 in a)||!($1 in b)。この条件は、$5行の値を配列の値と比較しa$1同じ行の値を配列の値と比較しますb。ご注意ください、状況テスト矛盾$5a またはマッチ.​$1b

  • awkこれにより、各行のテストが続行されますOrphansOfTheDay。 2回目は状況本当です、第二行動実行済み:{print "ALERT" > "alertfile"; close ("alertfile")}ジョブがまだ存在しない場合は、ジョブをalertfileリダイレクトして閉じて、出力バッファがフラッシュされていることを確認してください。print "ALERT"alertfile

「警告」出力を使用して、新しい疑わしい孤児が見つかったことを示します。 「警告」の存在または内容をalertfile使用して、電子メールを送信するかどうかを決定できます。

この時点でOrphansOfTheDay処理が完了し、疑わしい孤児が見つかると、「警告」が生成されます。まだやるべき2つのことがあります。

  1. 次のアドレスに手紙を書くOrphansOfTheDayOrphansOfRecord
mv OrphansOfTheDay OrphansOfRecord
  1. 「警告」が設定されると、メールが送信されalertfile消去されます。
if [ -e alertfile ] 
then 
   mail -s "ALERT: NEW ORPHAN FOUND" pi < OrphansOfRecord 
   rm alertfile
fi

クリスマスが近づいていますが、まだ時間がない日が数日残りました。すぐにスクリプトを作成します。それとも直接続けることもできます。

関連情報