Как захватить PID фонового процесса - PullRequest
0 голосов
/ 29 мая 2018

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

fn_list()
{
... ... ... 
groovy list_gn.gy -p $prop_file $@ &
echo "Extracting PID No :$!" >> $logpid
}

Я вызываю эту функцию следующим образом в цикле:

for x in `cat $list | grep -v '#'`; do
fn_list &
echo "Extracting function PID No :$!" >> $logpid
done

Поскольку я запускаю эту функцию в фоновом режиме,а также groovy, который запускается этой функцией, работает в фоновом режиме (используя &).

Мой вопрос заключается в том, что я регистрирую PID функции и также регистрирую PID скрипта groovy, который вызывается извнутри этой функции.Будут ли отличаться идентификаторы PID для функции и Groovy, который вызывается изнутри этой функции?И правильно ли регистрировать PID?

Мне нужно понять его поведение, потому что я планирую разветвить процесс функции 3 раза.Поэтому хочу быть абсолютно уверенным, если это правильный подход.

1 Ответ

0 голосов
/ 29 мая 2018

фактически pid выделяются не bash, а операционной системой; когда процесс разветвляется, ему назначается новый pid, вызывая groovy .. & из bash-процесса, создающего новый дочерний процесс groovy, родительский процесс которого в bash-процессе.

вызов функции bash не создает новый pid, поскольку он запускается в том же процессе, что и встроенная команда.

Однако из-за & после вызова функции это создает новыйпроцесс bash (subshell), возможно, один из двух & не нужен.

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

pids=()
for ... ; do
    groovy ... &
    pids+=( "$!" )
done

exit_codes=()
for pid in "${pid[@]}"; do
    wait "$pid"
    exit_codes+=( "$?" )
done
...