새로운 고아 PID를 모니터링하고 경고하는 스크립트

새로운 고아 PID를 모니터링하고 경고하는 스크립트

새로 고아가 된 PID를 어떻게 감지하고 경고합니까? 특정 사용자에 대해 하루에 한 번 고아 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) ppid의 값 은 1,그리고세 번째 필드( $3)는 사용자의 문자열( pi이 경우)입니다. 내 시스템에서 실행하면 위와 같은 결과가 나타납니다.

하지만 지금은교활한stat... AFAIK, 필드 자체에는 식별할 값이 없습니다.유아프로세스, 즉 상위 프로세스가 종료되었지만 init이 프로세스에 의해 채택되었습니다. 즉, 해당 프로세스는 pid1입니다. PROCESS STATE CODES섹션을 확인하여 man ps해당 필드에 가능한 값을 확인할 수 있습니다 stat. 값은 ""는 좀비 프로세스를 의미합니다. 이것은고아와 비슷하지만 다릅니다..

대체로 ps프로세스가 고아인지 여부를 명시적으로 알 수 있는 방법이 없으므로 위 명령의 출력을 다음과 같이 처리해야 합니다.용의자 목록추가 조사를 기다리고 있습니다.

사용자와 시스템에 따라 다음을 수행할 수 있습니다.들어오지 못하게 하다stat일부 절차는 코드 또는 command필드 값을 기반으로 합니다 . 예를 들어 위 명령은 =( systemd)를 통해 프로세스를 찾았습니다. 이 프로세스는 고아가 아닙니다. AFAICT, 위 명령으로 출력된 5개 매개변수는 목표 달성을 위한 합리적인 기반을 제공합니다.statSsps

2. 새로운 고아가 발견되면 경고 설정

다음을 권장합니다방법알림 설정 사용고아 탐지위 1단계의 명령입니다.

두 개의 파일이 사용됩니다: OrphansOfRecord, 및 OrphansOfTheDayOrphansOfTheDay는 다음과 같이 생성됩니다.

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];}처형되다. 이 작업은 각각 배열의 각 행에 대한 필드 $5( command) 및 ( ) 값을 저장합니다. $1예를 들어, 파일에 3개의 라인(또는 레코드)이 있는 경우 &에는 이 명령이 완료될 때 각각 3개의 요소가 포함됩니다.pidOrphansOfRecordabOrphansOfRecordab

  • OrphansOfRecord의 모든 줄을 읽은 후 NR == FNRfalse가 되고 awk두 번째 파일을 읽기 시작합니다 OrphansOfTheDay. OrphansOfTheDay첫 번째 줄을 읽은 후 두 번째 줄을 읽으세요.상황다음과 같이 평가됩니다 !($5 in a)||!($1 in b). 이 조건은 $5행의 값을 배열의 값과 비교하고 a, $1같은 행의 값을 배열의 값과 비교합니다 b. 참고하시기 바랍니다,상황시험불일치$5a 또는성냥.​$1b

  • awk그러면 각 행에 대한 테스트가 계속됩니다 OrphansOfTheDay. 두 번째 때는상황사실이에요, 두 번째행동실행됨: {print "ALERT" > "alertfile"; close ("alertfile")}작업 이 아직 존재하지 않는 경우 작업을 alertfile리디렉션 하고 닫아 출력 버퍼가 플러시되는지 확인합니다.print "ALERT"alertfile

"경고" 출력을 사용하여 새로운 의심스러운 고아가 발견되었음을 나타낼 수 있습니다. "경고"의 존재 또는 내용을 alertfile사용하여 이메일을 보내야 하는지 여부를 결정할 수 있습니다.

이 시점에서 OrphansOfTheDay처리가 완료되고 의심스러운 고아가 발견되면 "경고"가 생성됩니다. 아직 수행해야 할 두 가지 작업이 있습니다.

  1. 다음 주소로 편지 쓰기 OrphansOfTheDay:OrphansOfRecord
mv OrphansOfTheDay OrphansOfRecord
  1. "경고"가 설정되면 이메일이 전송되고 alertfile지워집니다.
if [ -e alertfile ] 
then 
   mail -s "ALERT: NEW ORPHAN FOUND" pi < OrphansOfRecord 
   rm alertfile
fi

크리스마스가 다가오고 있는데 아직 시간이 없는 날이 며칠 남았습니다. 곧 스크립트를 작성하겠습니다. 아니면 직접 계속할 수도 있습니다.

관련 정보