새로 고아가 된 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
( ).$0
ps
만약에두 번째 필드( $2
) ppid
의 값 은 1
,그리고세 번째 필드( $3
)는 사용자의 문자열( pi
이 경우)입니다. 내 시스템에서 실행하면 위와 같은 결과가 나타납니다.
하지만 지금은교활한stat
... AFAIK, 필드 자체에는 식별할 값이 없습니다.유아프로세스, 즉 상위 프로세스가 종료되었지만 init
이 프로세스에 의해 채택되었습니다. 즉, 해당 프로세스는 pid
1입니다. PROCESS STATE CODES
섹션을 확인하여 man ps
해당 필드에 가능한 값을 확인할 수 있습니다 stat
. 값은 "지"는 좀비 프로세스를 의미합니다. 이것은고아와 비슷하지만 다릅니다..
대체로 ps
프로세스가 고아인지 여부를 명시적으로 알 수 있는 방법이 없으므로 위 명령의 출력을 다음과 같이 처리해야 합니다.용의자 목록추가 조사를 기다리고 있습니다.
사용자와 시스템에 따라 다음을 수행할 수 있습니다.들어오지 못하게 하다stat
일부 절차는 코드 또는 command
필드 값을 기반으로 합니다 . 예를 들어 위 명령은 =( systemd
)를 통해 프로세스를 찾았습니다. 이 프로세스는 고아가 아닙니다. AFAICT, 위 명령으로 출력된 5개 매개변수는 목표 달성을 위한 합리적인 기반을 제공합니다.stat
Ss
ps
2. 새로운 고아가 발견되면 경고 설정
다음을 권장합니다방법알림 설정 사용고아 탐지위 1단계의 명령입니다.
두 개의 파일이 사용됩니다: 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
두 번째 파일을 읽기 시작합니다OrphansOfTheDay
.OrphansOfTheDay
첫 번째 줄을 읽은 후 두 번째 줄을 읽으세요.상황다음과 같이 평가됩니다!($5 in a)||!($1 in b)
. 이 조건은$5
행의 값을 배열의 값과 비교하고a
,$1
같은 행의 값을 배열의 값과 비교합니다b
. 참고하시기 바랍니다,상황시험불일치의$5
a
또는ㅏ성냥.$1
b
awk
그러면 각 행에 대한 테스트가 계속됩니다OrphansOfTheDay
. 두 번째 때는상황사실이에요, 두 번째행동실행됨:{print "ALERT" > "alertfile"; close ("alertfile")}
작업 이 아직 존재하지 않는 경우 작업을alertfile
리디렉션 하고 닫아 출력 버퍼가 플러시되는지 확인합니다.print "ALERT"
alertfile
"경고" 출력을 사용하여 새로운 의심스러운 고아가 발견되었음을 나타낼 수 있습니다. "경고"의 존재 또는 내용을 alertfile
사용하여 이메일을 보내야 하는지 여부를 결정할 수 있습니다.
이 시점에서 OrphansOfTheDay
처리가 완료되고 의심스러운 고아가 발견되면 "경고"가 생성됩니다. 아직 수행해야 할 두 가지 작업이 있습니다.
- 다음 주소로 편지 쓰기
OrphansOfTheDay
:OrphansOfRecord
mv OrphansOfTheDay OrphansOfRecord
- "경고"가 설정되면 이메일이 전송되고
alertfile
지워집니다.
if [ -e alertfile ]
then
mail -s "ALERT: NEW ORPHAN FOUND" pi < OrphansOfRecord
rm alertfile
fi
크리스마스가 다가오고 있는데 아직 시간이 없는 날이 며칠 남았습니다. 곧 스크립트를 작성하겠습니다. 아니면 직접 계속할 수도 있습니다.