Я бы рекомендовал НЕ использовать global
/ window
/ eval
для этой цели. Вместо этого сделайте это следующим образом:
определите все методы как свойства обработчика:
var Handler={};
Handler.application_run = function (name) {
console.log(name)
}
Теперь назовите его следующим образом:
var somefunc = "application_run";
Handler[somefunc]('jerry');
Выход: jerry
Вы не говорите, является ли дерево, которое Вы хотите уничтожить, единственной группой процесса. (Это часто имеет место, если дерево является результатом разветвления с сервера, запускаются или командная строка оболочки.) Можно обнаружить группы процесса, использующие PS GNU следующим образом:
ps x -o "%p %r %y %x %c "
, Если это - группа процесса, Вы хотите уничтожить, просто использовать эти kill(1)
команда, но вместо того, чтобы дать ему число процесса, дайте его отрицание из числа группы. Например, для уничтожения каждого процесса в группе 5112 используйте kill -TERM -- -5112
.
Спасибо за Вашу мудрость, людей. Мой сценарий оставлял некоторые дочерние процессы на выходе и отрицание подсказка сделанный вещами легче. Я записал эту функцию, которая будет использоваться в других сценариях при необходимости:
# 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
}
Аплодисменты.
если Вы знаете, передают изодромный с предварением из родительского процесса, вот сценарий оболочки, который должен работать:
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
ответ brad - то, что я рекомендовал бы также, за исключением того, что можно покончить awk
в целом, если Вы используете --ppid
опция к ps
.
for child in $(ps -o pid -ax --ppid $PPID) do ....... done
Чтобы рекурсивно уничтожить дерево процессов, используйте 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 $@
если в вашей системе есть pstree и perl, вы можете попробовать следующее:
perl -e 'kill 9, (`pstree -p PID` =~ m/\((\d+)\)/sg)'