저는 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
명령줄을 해석한 동일한 프로세스에서 실행됩니다. 이는 해당 하위 쉘에서 실행된 마지막 명령이었기 때문입니다(따라서 bash
a 최적화 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