2016-09-07 2 views
0

Я запускаю свое приложение, запуская множество процессов, я использую скрипт (bash), чтобы запустить его.Процессы убивания начались параллельно

  • filemane является: start.sh и я использую sudo ./start.sh запустить
  • Сценарий в start.sh является:

#!/bin/sh sudo p1 > p1.txt && p2 > p2.txt && p3 > p3.txt

, чтобы остановить мое приложение я использую ctrl-c, но не все процессы останавливаются. Я знаю, что могу найти с ps aux | less | grep ..., это кажется длинным, и я хочу знать, есть ли и легко ждать, чтобы остановить мои процессы.

обновление жаль, что это вместо того, чтобы (только один &)

sudo f1/p1.py > logs/p1.txt & sudo f2/p2.sh > logs/p2.txt & sudo nodemon f3/p3.js > logs/p3.txt 
+2

Если у вас есть 'пс && p2 p3 && ...', то у вас есть только один процесс работает на время. После успешного завершения p1, p2 начинается и так далее. – anishsane

+0

Кроме того, поскольку 'start.sh' был запущен с' sudo', вам не нужно явно запускать 'p1' с' sudo'. – anishsane

+0

Теперь, как этот индивидуальный процесс реагирует на 'ctrl + c' (или, вернее, на' SIGINT'), зависит от того, как это приложение закодировано. Он может обрабатывать 'SIGINT' и заканчиваться успехом или неудачей, основываясь на том, как он кодируется. но нажатие 'ctrl + c' (передача SIGINT) не означает, что процесс завершится. Это обычное/обычное поведение, но не обязательно вести себя таким образом. – anishsane

ответ

1

Хранить ИДП и установить ловушку, чтобы убить их, когда сигнал или на выходе:

#!/bin/bash 
#  ^^^^ - NOT /bin/sh, as this code uses arrays 

pids=() 

# define cleanup function 
cleanup() { 
    for pid in "${pids[@]}"; do 
    kill -0 "$pid" && kill "$pid" # kill process only if it's still running 
    done 
} 

# and set that function to run before we exit, or specifically when we get a SIGTERM 
trap cleanup EXIT TERM 

sudo f1/p1.py > logs/p1.txt & pids+=("$!") 
sudo f2/p2.sh > logs/p2.txt & pids+=("$!") 
sudo nodemon f3/p3.js > logs/p3.txt & pids+=("$!") 

wait # sleep until all background processes have exited, or a trap fires 
0

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

пример: Убить процесс

pkill skype 

скайп Более подробные параметры см man pkill.

0

Если вы знаете оболочку PID (идентификатор процесса), вы можете сделать:

pkill -TERM -P PPID 

где PPID ваша оболочка PID (подпроцессов родителя PID).

+0

Разве не '' pid '' обычно в '$$' в 'bash'? –

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