Лучший способ убить процессы, созданные сценарием bash?

Портативный, POSIX-совместимый перевод подхода gawk Стефана Шазеласа:

find . -type f -exec cat {} + |
awk '
    FNR==NR {keys[tolower($0)]; n++; next}
    {
        s = tolower($0)
        for (k in keys) 
            if (index(s, k)) {
                delete keys[k]
                if (!--n)
                    exit
            }
    }
    END {
        for (k in keys) print k, "has no occurrence"
    }
' /tmp/listOfKeys.txt -

Если только ваши исходные файлы не необычны, в том смысле, что их имена постоянно длиннее их содержимого, решение Стефана должно быть более эффективным, потому что меньше данных передается по трубопроводу (что включает копирование между буферами в двух процессах через ядро).

4
11.03.2017, 03:32
3 ответа

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

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

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

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

-P ppid Сопоставлять только процессы, чей идентификатор родительского процесса указан в списке

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

4
27.01.2020, 20:53

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

Например:

screen -X -S website_status quit
0
27.01.2020, 20:53

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

Итак, как @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(Process ID)

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/

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

pkill -9 -x $process_name

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

pkill -9 -s $sess
3
27.01.2020, 20:53

Теги

Похожие вопросы