pgrep -P $$ дает несуществующий идентификатор процесса

#!/usr/bin/env bash
sleep 3 &                               # Spawn a child

trap '
    pgrep -P $$                         # Outputs one PID as expected
    PIDS=( $( pgrep -P $$ ) )           # Saves an extra nonexistant PID
    echo "PIDS: ${PIDS[@]}"             # You can see it is the last one
    ps -o pid= "${PIDS[@]:(-1)}" ||
    echo "Dafuq is ${PIDS[@]:(-1)}?"    # Yep, it does not exist!

' 0 1 2 3 15

Выводит

11800
PIDS: 11800 11802
Dafuq is 11802?

Это происходит только с ловушками. Почему к массиву добавлен несуществующий PID? И как избежать этого странного поведения?

1 ответ

Используя $(...)Вы создали подпроцесс, который будет выполнять этот код.

Естественно, родителем этого процесса будет текущая оболочка, поэтому она будет в списке.

Что касается обходного пути, вы можете удалить этот PID из списка. Сначала вы должны знать, как получить доступ к PID подоболочки: $$ в сценарии против $$ в подоболочке. Теперь вы можете отфильтровать его (нет, это не работает):

PIDS=( $( pgrep -P $$ | grep -v ^$BASHPID$ ) )
Другие вопросы по тегам