2014-01-08 5 views
2

Как скрипт KornShell (ksh) выйдет из системы или запустят все процессы из другого сценария ksh?Выйти из всех скриптов KornShell (ksh)

Если scriptA.ksh вызывает scriptB.ksh то следующий код работает достаточно хорошо, но есть лучшее решение для этого ?:

scriptA.ksh:

#call scriptBSnippet 
scriptBSnippet.ksh ${a} 

scriptB. КШ:

#if error: exit this script (scriptB) and calling script (scriptA)# 
kill ${PPID} 
exit 1 

Чтобы добавить сложность, что если Scripta вызывает scriptB который вызывает ОПЗ iptC, то как выйти из всех трех скриптов, если в скрипте C есть ошибка?

scriptA.ksh:

#call scriptBSnippet 
scriptBSnippet.ksh ${a} 

scriptB.ksh:

#if error: exit this script (scriptB) and calling script (scriptA)# 
kill ${PPID} 
exit 1 

scriptC.ksh:

#if error: exit this script (scriptC) and calling scripts (scriptA, scriptB)# 
#kill ${PPID} 
#exit 1 

Спасибо авансовый.

ответ

1

Убивание всех процессов, запущенных одним и тем же сценарием, является немного грубым методом.

Было бы лучше иметь некоторый способ связи между процессами, которые позволили бы им изящно завершить работу.

Однако, если все процессы находятся в одной и той же группе процессов, вы можете послать сигнал всей группы процессов:

kill -${Signal:?} -${Pgid:?} 

Обратите внимание, что два аргумента необходимы в данном случае. Единственный аргумент, начинающийся с -, всегда интерпретируется как сигнал.

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

parent.sh:

Shell=ksh 
($Shell -c :) || exit 

$Shell child1.sh & pid1=$! 

$Shell child2.sh & pid2=$! 

$Shell child3.sh & pid3=$! 

ps -o pid,sid,pgid,tty,cmd $PPID $$ $pid1 $pid2 $pid3 
exit 

child.sh:

sleep 50 

Если запустить parent.sh из терминала - он станет лидером процесса.

granny.sh:

Shell=ksh 
($Shell -c :) || exit 

$Shell parent.sh & 

wait 
exit 

Если запустить parent.sh из другого сценария granny.sh, то что будет лидером группы процессов, и будет включен при использовании метода kill -SIG -PGID.

См. Также этот ответ на: What are “session leaders” in ps? для фона на сессиях и группах процессов.

+0

Эти сценарии ksh (scriptA, scriptB, scriptC) должны быть как можно более развязаны, и каждый сценарий должен иметь как можно меньше входных параметров. Это решение потребует дополнительных входных параметров ... – javaPlease42

+1

Это решение, безусловно, потребует больше работы. –

+0

Если каждый скрипт может помещаться в одну и ту же группу процессов (Pgid), тогда это может сработать, чтобы понять, как это сделать? – javaPlease42

Смежные вопросы