bash 스크립트로 생성된 프로세스를 종료하는 가장 좋은 방법은 무엇입니까?

bash 스크립트로 생성된 프로세스를 종료하는 가장 좋은 방법은 무엇입니까?

많은 하위 프로세스(약 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

관련 정보