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$ ) )