A melhor maneira de matar processos criados pelo script bash?

4

Eu tenho um script em execução em um servidor e ele cria muitos subprocessos (por volta de 800). Eu quero matar todos eles em um trecho. Abaixo está a informação 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}

Matar o script só não deu certo, qual é o melhor e mais rápido caminho se eu tiver muitos subprocesso aqui?

    
por prado 11.03.2017 / 02:32

3 respostas

2

Você já tentou pkill -signal -P ppid ?

Do manual do pkill:

pkill - look up or signal processes based on name and other attributes

-signal Defines the signal to send to each matched process

-P ppid Only match processes whose parent process ID is listed

Se você quisesse matar 2432, e todos os seus filhos, você deveria primeiro tentar pkill -15 -P 2432 , e se isso não funcionar e você está disposto a usar a opção nuclear: pkill -9 -P 2432 .

    
por 11.03.2017 / 03:01
1

Eu fiz uma pequena pesquisa e acho que pouca explicação ajudará os outros.

Então, como @Schives respondeu , com o PPID poderemos encerrar o processo todo filho e pai .

Mas como obter o PPID facilmente?

ps -o pid,ppid,sess,cmd -U webmon

ou

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:~$

então, pkill -15 -P 16787

onde webmon é o usuário que está executando o processo.

Eu me deparei com outras maneiras de matar o processo pai e filho em um blog , estou colando-os aqui.

Isso requer PID,PPID,PGID,GID e como obtê-los?

ps -o pid,ppid,pgid,gid,sess,cmd -U username

1. matar um grupo de processos com PID negativo (ID do processo)

kill  -TERM -PID

É para matar o PID e todos os seus processos filhos.

2. matar um grupo de processos com o seu PGID (Process Group ID)

kill -- -$PGID   Kill using the default signal (TERM = 15)
kill -9 -$PGID   Kill using the KILL signal (9)

3. matar um grupo de processos com apenas informações PID

kill -- -$(ps -o pgid= $PID | grep -o [0-9]*)

Na verdade, você pode perceber que é apenas o caminho do # 2

4. Usando pkill, mate processos por PGID (Proess Group ID)

pkill -9 -g $PGID

5. Usando pkill, mate processos por GID (Group ID)

pkill -9 -G $GID

6. Usando o pkill, mate processos pelo PPID (Parent Process ID)

pkill -9 -p $PPID

7. Usando pkill, mate processos por terminal

pkill -9 -t $terminal

Nota: sem / dev / prefix

8. Usando pkill, mate processos por nome de processo

pkill -9 -x $process_name

9. Usando pkill, mate processos por sessão

pkill -9 -s $sess
    
por 15.03.2017 / 03:32
0

Você pode tentar quit da sessão de tela, ponto no qual deve matar os processos filhos.

Por exemplo:

screen -X -S website_status quit
    
por 14.03.2017 / 14:46