이것은 내 Pi 4에 있습니다.
다음 명령을 실행할 때:
#!/bin/bash
strScriptName=$(basename $BASH_SOURCE)
pidof -x "$strScriptName" | tr " " "\n"
pid=$(pidof -x "$strScriptName" | tr " " "\n")
echo $pid
pidof -x "$strScriptName" | tr " " "\n"
나는 다음과 같은 것을 얻습니다 :
12703
12707 12703
12703
pidof 명령만 사용하면 단일 PID가 생성되지만 결과를 변수에 저장하면 2개의 PID가 생성되는 이유를 설명해 주세요. (tr 명령을 끄면 PID가 생성되므로 다른 명령으로 파이프하는 것과 관련이 있는 것 같지만 결과를 변수에 저장할 때 왜 다른 결과가 나오는지 버그가 있습니다.)
답변1
이는 명령 대체가 Bash에서 쉘 프로세스의 실제 복사본인 서브쉘을 시작하기 때문일 가능성이 높습니다. 따라서 두 개의 쉘이 있고 둘 다 명령줄을 통해 실행 중인 프로세스로 표시되므로 bash scriptname.sh
찾으면 pidof
두 개의 쉘이 있음을 알 수 있습니다.
(파이프는 실제로 파이프의 특정 부분에 대한 하위 쉘도 실행하지만 쉘이 실제 명령을 너무 빨리 실행하기 때문에 이를 보지 못할 수도 있습니다.)
그러나 원하는 것이 스크립트의 PID라면 이 클래스를 사용할 필요가 없으며 pidof
PID를 로 사용할 수 있습니다 $$
. 마찬가지로 에서 호출 스크립트의 이름을 얻을 수 있습니다 $0
.