Как лучше всего отправить сигнал всем членам группы процессов?

Я бы рекомендовал НЕ использовать global / window / eval для этой цели. Вместо этого сделайте это следующим образом:

определите все методы как свойства обработчика:

var Handler={};

Handler.application_run = function (name) {
console.log(name)
}

Теперь назовите его следующим образом:

var somefunc = "application_run";
Handler[somefunc]('jerry');

Выход: jerry

405
задан codeforester 7 July 2018 в 16:58
поделиться

7 ответов

Вы не говорите, является ли дерево, которое Вы хотите уничтожить, единственной группой процесса. (Это часто имеет место, если дерево является результатом разветвления с сервера, запускаются или командная строка оболочки.) Можно обнаружить группы процесса, использующие PS GNU следующим образом:

 ps x -o  "%p %r %y %x %c "

, Если это - группа процесса, Вы хотите уничтожить, просто использовать эти kill(1) команда, но вместо того, чтобы дать ему число процесса, дайте его отрицание из числа группы. Например, для уничтожения каждого процесса в группе 5112 используйте kill -TERM -- -5112.

286
ответ дан vog 7 July 2018 в 16:58
поделиться
  • 1
    Tools-> Options-> Text Editor-> XAML-> Разное, проверьте " Всегда открывайте документы в полном XAML view". – Bryan Anderson 12 May 2009 в 21:38

Спасибо за Вашу мудрость, людей. Мой сценарий оставлял некоторые дочерние процессы на выходе и отрицание подсказка сделанный вещами легче. Я записал эту функцию, которая будет использоваться в других сценариях при необходимости:

# kill my group's subprocesses:          killGroup
# kill also myself:                      killGroup -x
# kill another group's subprocesses:     killGroup N  
# kill that group all:                   killGroup -x N
# N: PID of the main process (= process group ID).

function killGroup () {
    local prid mainpid
    case $1 in
        -x) [ -n "$2" ] && kill -9 -$2 || kill -9 -$ ;;
        "") mainpid=$ ;;
         *) mainpid=$1 ;;
    esac
    prid=$(ps ax -o pid,pgid | grep $mainpid)
    prid=${prid//$mainpid/}
    kill -9 $prid 2>/dev/null
    return
}

Аплодисменты.

1
ответ дан 7 July 2018 в 16:58
поделиться

если Вы знаете, передают изодромный с предварением из родительского процесса, вот сценарий оболочки, который должен работать:

for child in $(ps -o pid,ppid -ax | \
   awk "{ if ( \$2 == $pid ) { print \$1 }}")
do
  echo "Killing child process $child because ppid = $pid"
  kill $child
done
9
ответ дан brad.lane 7 July 2018 в 16:58
поделиться
  • 1
    да, это было точно проблемой. Спасибо! – Adrian Grigore 13 April 2010 в 16:54

ответ brad - то, что я рекомендовал бы также, за исключением того, что можно покончить awk в целом, если Вы используете --ppid опция к ps.

for child in $(ps -o pid -ax --ppid $PPID) do ....... done
11
ответ дан warvariuc 7 July 2018 в 16:58
поделиться
ps -o pid= --ppid $PPID | xargs kill -9 
0
ответ дан Christian 8 July 2018 в 02:58
поделиться
  • 1
    Я знаю, что мы должны ожидать причина фраза, но Вы подразумеваете, что это кроме - ион также?;-) – Lucius 1 September 2013 в 22:11

Чтобы рекурсивно уничтожить дерево процессов, используйте killtree ():

#!/bin/bash

killtree() {
    local _pid=$1
    local _sig=${2:--TERM}
    kill -stop ${_pid} # needed to stop quickly forking parent from producing children between child killing and parent killing
    for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
        killtree ${_child} ${_sig}
    done
    kill -${_sig} ${_pid}
}

if [ $# -eq 0 -o $# -gt 2 ]; then
    echo "Usage: $(basename $0) <pid> [signal]"
    exit 1
fi

killtree $@
100
ответ дан 22 November 2019 в 23:32
поделиться

если в вашей системе есть pstree и perl, вы можете попробовать следующее:

perl -e 'kill 9, (`pstree -p PID` =~ m/\((\d+)\)/sg)'
0
ответ дан 22 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

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