Получить идентификаторы всех порожденных процессов из xargs

В моем скрипте есть следующее: список кошек | 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 просто загружает данные из онлайн-базы данных.

1
задан 15 July 2020 в 21:27

1 ответ

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 при запуске.

0
ответ дан 30 July 2020 в 22:07

Другие вопросы по тегам:

Похожие вопросы: