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

  • Имя файла: 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
0
dmx 7 Сен 2016 в 18:23

3 ответа

Лучший ответ

Сохраните PID и установите ловушку для их уничтожения при получении сигнала или при выходе:

#!/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
1
Charles Duffy 7 Сен 2016 в 17:28

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

Пример: убить процесс скайпа

pkill skype

Для получения более подробной информации см. man pkill.

0
Samundra 7 Сен 2016 в 15:28

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

pkill -TERM -P PPID

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

0
MarcoS 7 Сен 2016 в 15:36