Портативный, 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 -
Если только ваши исходные файлы не необычны, в том смысле, что их имена постоянно длиннее их содержимого, решение Стефана должно быть более эффективным, потому что меньше данных передается по трубопроводу (что включает копирование между буферами в двух процессах через ядро).
Вы пробовали pkill -signal -P ppid
?
Из руководства по pkill:
pkill - посмотрите вверх или сигнальные процессы на основе имени и других атрибутов
-signal Определяет сигнал для отправки каждому согласованному процессу
-P ppid Сопоставлять только процессы, чей идентификатор родительского процесса указан в списке
Если вы хотите уничтожить 2432 и все его дети, вы должны сначала попробовать pkill -15 -P 2432
, и если это не сработает, и вы готовы использовать ядерный вариант: pkill -9 -P 2432
.
Вы можете попытаться выйти
из сеанса screen, после чего он должен убить дочерние процессы.
Например:
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(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