Лучший способ убить процессы, созданные скриптом 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} 

Убийство скрипта только не получилось, какой лучший и быстрый способ, если у меня есть много подпроцессов здесь?

Вы пробовали pkill -signal -P ppid ?

Из руководства pkill:

pkill – поиск или сигнальные процессы на основе имени и других атрибутов

-signal Определяет сигнал для отправки в каждый согласованный процесс

-P ppid Только соответствие процессам, список родительских процессов которых указан

Если вы хотите убить 2432 и всех своих детей, сначала попробуйте pkill -15 -P 2432 , и если это не сработает, и вы готовы использовать ядерную опцию: pkill -9 -P 2432 .

Вы можете попытаться quit из сеанса экрана, после чего он должен убить дочерние процессы.

Например:

 screen -X -S website_status quit 

Я сделал небольшое исследование, и я думаю, что небольшое объяснение поможет другим.

Так как @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

где webmon является пользователем, выполняющим этот процесс.

Я столкнулся с другими способами, чтобы убить родительский и дочерний процесс в блоге , я вставляю их здесь.

Для этого нужны PID,PPID,PGID,GID и как их получить?

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

1. убить группу процессов с отрицательным PID (идентификатор процесса)

 kill -TERM -PID 

Это убить PID и все его дочерние процессы.

2. убить группу процессов с их PGID (идентификатор группы процессов)

 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 (идентификатор группы Proess)

 pkill -9 -g $PGID 

5. Используя pkill, уничтожьте процессы с помощью GID (идентификатор группы)

 pkill -9 -G $GID 

6. Используя pkill, уничтожьте процессы с помощью PPID (идентификатор родительского процесса)

 pkill -9 -p $PPID 

7. Использование pkill, уничтожить процессы с помощью терминала

 pkill -9 -t $terminal 

Примечание: без / dev / prefix

8. Используя pkill, уничтожьте процессы по имени процесса

 pkill -9 -x $process_name 

9. Использование pkill, убить процессы по сеансу

 pkill -9 -s $sess