셸 대신 실행 중인 스크립트의 PID를 어떻게 얻을 수 있나요?

셸 대신 실행 중인 스크립트의 PID를 어떻게 얻을 수 있나요?

실행에는 ./run_func_and_get_pid.sh다음이 있습니다.

#!/bin/bash

run () {
    while true
    do
        "$@" & echo -n $! > duh && echo "" `cat duh` `cat dih`
        sleep 5
    done
}

run echo -n my name is mudd & echo -n $$ > dih

산출

my name is mudd 392056 392054
my name is mudd 392060 392054
my name is mudd 392066 392054
my name is mudd 392070 392054
my name is mudd 392074 392054
my name is mudd 392082 392054
my name is mudd 392087 392054
my name is mudd 392091 392054
my name is mudd 392095 392054
my name is mudd 392122 392054
my name is mudd 392126 392054
my name is mudd 392130 392054
my name is mudd 392134 392054
my name is mudd 392139 392054
my name is mudd 392143 392054
my name is mudd 392147 392054
my name is mudd 392151 392054
my name is mudd 392160 392054
my name is mudd 392164 392054
. . .

이것우편 엽서이것이 392054pid일 것이라고 제안했지만 run_func_and_get_pid.sh나중에 알아냈습니다.

$ ps aux | grep run_func
. . .
user   392055  0.0  0.0   9632  1852 pts/5    S    09:51   0:00 /bin/bash ./run_func_and_get_pid.sh
user   398763  0.0  0.0   9040  2508 pts/6    S+   10:10   0:00 grep -I --color=auto run_func

$ ps aux | grep 392054
user   398975  0.0  0.0   9040   720 pts/6    S+   10:13   0:00 grep -I --color=auto 392054

나는 이것이 392054명령을 실행할 때 생성되는 bash 쉘이라고 추측할 수 있습니다. 프로세스가 무엇이든 종료되었습니다.

스크립트의 상위가 아닌 실행 중인 스크립트의 PID를 어떻게 얻나요?

답변1

이것:

run ... & echo ...

백그라운드에서 실행할 새 셸 프로세스를 포크한 run다음 를 사용합니다 echo. 후자는 오랫동안 실행되지 않으므로 기본 스크립트가 상당히 빠르게 종료되고 $$이미 종료된 프로세스를 가리킵니다.

답변 버전에서는 백그라운드 프로세스를 시작하지 않으므로 run(실제로 아무 이유 없이) 기본 스크립트와 동일한 프로세스에서 실행됩니다.

더 간단한 예를 들어보려면 다음을 시도해 보세요.

#!/bin/bash
echo "main script: $$"
f() {
    sleep 5;
    echo "bg job: $BASH_PID"
    ps "$BASH_PID";
}
f &

그래서:

$ bash bg.sh; sleep 3
main script: 32553
bg job: 32554
  PID TTY      STAT   TIME COMMAND
32554 pts/1    S      0:00 bash bg.sh

답변2

처음 시작할 때는 이 질문에 대한 답이 없었지만 이제는 답을 얻었습니다.

392054이는 함수의 PID인 것 같습니다 run. 다음을 수행하도록 스크립트를 수정하면 예상한 결과를 얻을 수 있기 때문입니다.

#!/bin/bash

run () {
    while true
    do
        "$@" & echo -n $! > duh && echo "" `cat duh` `cat dih`
        sleep 5
    done
}

echo -n $$ > dih
run echo -n my name is mudd

관련 정보