백그라운드 프로세스는 자체 PID를 어떻게 알 수 있나요?

백그라운드 프로세스는 자체 PID를 어떻게 알 수 있나요?

저는 RH Linux 시스템에서 bash를 사용하고 있습니다.

일반적으로 $$ 변수를 사용하여 자신의 PID를 얻을 수 있습니다. 그러나 스크립트가 자체 기능 중 하나를 백그라운드 프로세스로 실행하는 경우 $$를 사용할 때 작동하지 않으며 백그라운드에서 실행되는 모든 함수는 상위 스크립트의 PID를 가져옵니다.

예를 들어 다음은 테스트 스크립트입니다.

    /tmp/test:
    #!/bin/bash
    echo "I am $$"
    function proce {
      sleep 3
      echo "$1 :: $$"
    }

    for x in aa bb cc; do
      eval "proce $x &"
      echo "Started: $!"
    done

실행 시:

    /tmp$ ./test
    I am 5253
    Started: 5254
    Started: 5256
    Started: 5258
    /tmp$ aa :: 5253
    bb :: 5253
    cc :: 5253

따라서 상위 스크립트(/tmp/test)는 PID 5253으로 실행되고 PID 5254, 5256 및 5258로 세 가지 백그라운드 프로세스를 시작합니다. 그러나 이러한 각 백그라운드 프로세스는 $$를 통해 5253 값을 얻습니다.

이러한 프로세스는 실제 PID를 어떻게 발견합니까?

답변1

$BASHPID당신이 찾고있는 것일 수도 있습니다.

배쉬 PID

현재 Bash 프로세스의 프로세스 ID로 확장됩니다. 이는 Bash를 다시 초기화할 필요가 없는 하위 쉘과 같은 경우에 따라 $$와 다릅니다.

상대적인$$

($$)는 쉘의 프로세스 ID로 확장됩니다. () 서브셸에서는 서브셸이 아닌 호출 셸의 프로세스 ID로 확장됩니다.

http://www.gnu.org/software/bash/manual/bashref.html#Bash-변수

답변2

그리고 bash:

echo "$BASHPID"

echo명령을 평가한 프로세스의 pid를 제공합니다.

(예: a 이후 enable -n echo) 프로세스의 pid와 반드시 동일할 필요는 없습니다.달리기echo명령.

bash(또는 모든 쉘)은 프로세스를 통해 자체 수프를 만듭니다. 어떤 프로세스가 무엇을 했는지 추측하는 것이 항상 유용한 것은 아닙니다.

$ readlink -f /proc/self "/proc/$BASHPID"
/proc/30868
/proc/30747
$ (readlink -f /proc/self "/proc/$BASHPID")
/proc/30869
/proc/30869

두 번째 경우에는 readlink명령줄을 해석한 동일한 프로세스에서 실행됩니다. 이는 해당 하위 쉘에서 실행된 마지막 명령이었기 때문입니다(따라서 basha 최적화 fork()).

이에 상응하는 내용은 모듈 zsh에 있습니다.zsh/system

$ zmodload zsh/system
$ echo $$ $sysparams[pid]
5155 5155
$ (echo $$ $sysparams[pid])
5155 30979

( zsh하위 쉘의 상위 pid도 노출됩니다 $sysparams[ppid]).

이식 가능한 방법은 다음과 같습니다.

pid=$(sh -c 'echo "$PPID"')

모든 쉘은 sh이 명령줄을 해석하는 서브쉘의 직접적인 하위 쉘로 실행 되어야 하므로 해당 서브쉘 sh이어야 합니다 .$PPID

관련 정보