많은 하위 프로세스(약 800개)를 생성하는 스크립트가 서버에서 실행되고 있습니다. 한 번에 다 죽이고 싶어요. 아래는 ps
정보 입니다 .
root 26363 0.0 0.0 119216 1464 ? Ss Mar02 0:00 SCREEN -S website_status
root 26365 0.0 0.0 108472 1844 pts/12 Ss Mar02 0:00 \_ /bin/bash
root 4910 0.0 0.0 161684 1956 pts/12 S Mar02 0:00 \_ su webmon
webmon 4939 0.0 0.0 108472 1924 pts/12 S+ Mar02 0:00 \_ bash
webmon 1094 3.4 0.0 107256 2432 pts/12 S 05:37 2:26 \_ sh /home/webmon/scripts/for_html/website/website_status.sh
webmon 5159 0.0 0.0 100956 1288 pts/12 S 05:37 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 5160 0.0 0.0 103252 816 pts/12 S 05:37 0:00 \_ grep in set
webmon 5161 0.0 0.0 105952 900 pts/12 S 05:37 0:00 \_ awk {print $1}
webmon 12094 0.0 0.0 100956 1288 pts/12 S 05:37 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 12095 0.0 0.0 103252 820 pts/12 S 05:37 0:00 \_ grep Sleep -c
webmon 15044 0.0 0.0 60240 3004 pts/12 S 05:37 0:00 \_ ssh -q 192.168.12.38 uptime | grep -o load.* | cut -f2 -d:
webmon 15166 0.0 0.0 100956 1292 pts/12 S 05:37 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 15167 0.0 0.0 103252 816 pts/12 S 05:37 0:00 \_ grep in set
webmon 15168 0.0 0.0 105952 900 pts/12 S 05:37 0:00 \_ awk {print $1}
webmon 18484 0.0 0.0 100956 1288 pts/12 S 05:38 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 18485 0.0 0.0 103252 816 pts/12 S 05:38 0:00 \_ grep in set
webmon 18486 0.0 0.0 105952 900 pts/12 S 05:38 0:00 \_ awk {print $1}
webmon 25110 0.0 0.0 60240 3008 pts/12 S 05:38 0:00 \_ ssh -q 192.168.12.38 uptime | grep -o load.* | cut -f2 -d:
webmon 2598 0.0 0.0 100956 1292 pts/12 S 05:38 0:00 \_ mysql -vvv -h 192.168.12.38 -uwebmon -px xxxxxxxxxxxxx -e show processlist;
webmon 2599 0.0 0.0 103252 816 pts/12 S 05:38 0:00 \_ grep in set
webmon 2600 0.0 0.0 105952 900 pts/12 S 05:38 0:00 \_ awk {print $1}
스크립트를 죽이는 것만으로는 작동하지 않습니다. 스크립트가 많은 경우 가장 좋고 가장 빠른 방법은 무엇입니까?하위 프로세스여기?
답변1
나는 약간의 연구를 해왔고 약간의 설명이 다른 사람들에게 도움이 될 것이라고 생각합니다.
@Schives가 말했듯이답변됨, PPID를 사용하면 모든 하위 프로세스와 상위 프로세스를 종료할 수 있습니다.
그런데 어떻게 PPID
쉽게 얻을 수 있을까요?
ps -o pid,ppid,sess,cmd -U webmon
또는
root@87-109:~$ ps -o pid,ppid,sess,cmd -U webmon | grep 'website_status.sh\|PID'
PID PPID SESS CMD
16848 16787 16787 sh website_status.sh
17667 4405 4405 grep --color=auto website_status.sh\|PID
root@87-109:~$
그 다음에,pkill -15 -P 16787
어디네트워크 모니터프로세스를 실행하는 사용자입니다.
부모 및 자식 프로세스를 종료하는 다른 방법을 발견했습니다.블로그, 여기에 붙여넣겠습니다.
요구 사항은 무엇 PID,PPID,PGID,GID
이며 이를 획득하는 방법은 무엇입니까?
ps -o pid,ppid,pgid,gid,sess,cmd -U username
1. 음수 PID(프로세스 ID)를 가진 프로세스 그룹을 종료합니다.
kill -TERM -PID
PID와 모든 하위 프로세스를 종료하십시오.
2. PGID(프로세스 그룹 ID)로 프로세스 그룹을 종료합니다.
kill -- -$PGID Kill using the default signal (TERM = 15)
kill -9 -$PGID Kill using the KILL signal (9)
3. PID 정보만 포함하는 그룹 프로세스 종료
kill -- -$(ps -o pgid= $PID | grep -o [0-9]*)
실제로 이것이 유일한 방법 #2라는 것을 알 수 있을 것입니다.
4. pkill을 사용하여 PGID(프로세스 그룹 ID)로 프로세스를 종료합니다.
pkill -9 -g $PGID
5. pkill을 사용하여 GID(그룹 ID)로 프로세스를 종료합니다.
pkill -9 -G $GID
6. pkill을 사용하여 PPID(상위 프로세스 ID)로 프로세스를 종료합니다.
pkill -9 -p $PPID
7. pkill을 사용하여 터미널을 통해 프로세스를 종료합니다.
pkill -9 -t $terminal
참고: /dev/ 접두사가 없습니다.
8. pkill을 사용하여 프로세스 이름으로 프로세스를 종료합니다.
pkill -9 -x $process_name
9. 세션별로 프로세스를 종료하려면 pkill을 사용하세요.
pkill -9 -s $sess
답변2
시도해 보셨나요 pkill -signal -P ppid
?
pkill 매뉴얼에서:
pkill - 이름 및 기타 속성을 기반으로 프로세스에 신호를 찾거나 보냅니다.
-signal은 일치하는 각 프로세스에 전송되는 신호를 정의합니다.
-P ppid는 상위 프로세스 ID가 나열된 프로세스만 일치합니다.
2432와 그 자식들을 모두 죽이고 싶다면 먼저 시도해 보아야 합니다. pkill -15 -P 2432
그래도 효과가 없고 핵 옵션을 사용할 의향이 있다면 다음과 같습니다 pkill -9 -P 2432
.
답변3
화면 세션을 시도하면 quit
하위 프로세스가 종료됩니다.
예를 들어:
screen -X -S website_status quit