В моем скрипте есть следующее:
список кошек | xargs -P6 -n2 ./first_queue &
где list
- это просто файл с парами слов, которые я хочу обработать:
word1 word2
word3 word4
и т.д .. .
first_queue
- это просто еще один скрипт. Я пытаюсь получить pid всех 6 процессов, порожденных этим xargs, сразу после того, как я его вызываю, чтобы позже я мог их завершить. Я читал, что $!
дает pid последнего процесса, который выполнялся в фоновом режиме. Однако я хочу всех 6 из них. Как я могу получить их?
Подробнее:
Я написал следующий небольшой скрипт для проверки того, что предложил @xenoid:
cat list | xargs -P6 -n2 ./first_queue &
id=$(echo $!)
echo $id
ids=$(pgrep -P $id)
echo $ids
ps aux | grep $id
for x in $ids; do
echo $x
ps aux | grep $x
kill $x
done
kill $id
ps aux | grep $id
for x in $ids; do
ps aux | grep $x
done
Вот first_queue
чрезвычайно упрощенный (для команды, которая дает мне проблема, и это продолжает работать, несмотря на выполнение kill
на родительском процессе, т.е. xargs, а также дочерних процессах):
srr=$1
bioproject=$2
prefetch $srr -O download_dir/$bioproject
prefetch
просто загружает данные из онлайн-базы данных.
PID, который вы получаете с $!
, является собственным PID xargs
(потому что это xargs
, который вы отправляете на задний план ...), а не один из ваших процессов. Если вы прервете его, он прекратит все свои дочерние процессы (т. Е. Все ваши процессы, которые все еще выполняются).
Если вы хотите, чтобы pids дочерних процессов вы могли использовать pgrep -P {parent}
где {parent}
- это xargs
PID.
Редактировать:
Когда вы запускаете команду (pid = Y) в скрипте (pid = X) и отправляете сигнал сценария (для pid = X), сигнал не передается команде (поэтому pid = Y не видит его).
Вы можете написать придуманный сценарий, который запускает команду в фоновом режиме, захватывает его pid (Y) перехватывает сигналы, отправляющие pid = X, и направляет их в pid = Y .
Но во многих случаях команда является последним значащим битом кода для запуска (сценарий завершается с кодом возврата команды). Когда это вместо использования:
some_initialization_code
the_command and the command args
exit $?
, вы пишете свой скрипт как:
some_initialization_code
exec the_command and the command args
В первом случае сценарий - это процесс с pid = X, а команда - это процесс с pid = Y. С exec
процесс с pid = X становится командой , и все происходит так, как если бы вы вызвали the_command
напрямую: pid = Y отсутствует, и сигналы отправлены чтобы обработать X (скрипт), он получает команду the_command
при запуске.
some_initialization_code
exec the_command and the command args
В первом случае сценарий - это процесс с pid = X, а команда - это процесс с pid = Y. С exec
процесс с pid = X становится командой , и все происходит так, как если бы вы вызвали the_command
напрямую: pid = Y отсутствует, и сигналы отправлены чтобы обработать X (скрипт), он получает команду the_command
при запуске.
some_initialization_code
exec the_command and the command args
В первом случае сценарий - это процесс с pid = X, а команда - это процесс с pid = Y. С exec
процесс с pid = X становится командой , и все происходит так, как если бы вы вызвали the_command
напрямую: pid = Y отсутствует, и сигналы отправлены чтобы обработать X (скрипт), он получает команду the_command
при запуске.