pgrep -P $$给出了一个不存在的进程ID

时间:2015-04-26 18:36:17

标签: bash pid subshell bash-trap

#!/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 个答案:

答案 0 :(得分:2)

通过使用$(...),您创建了一个将执行该代码的子流程。

当然,该进程的父进程将是当前的shell,因此它将被列出。

至于变通方法,您可以从列表中删除该PID。首先,您必须知道如何访问子shell PID:$$ in a script vs $$ in a subshell现在你可以将其过滤掉(不,它不起作用):

PIDS=( $( pgrep -P $$ | grep -v ^$BASHPID$ ) )