동일한 쉘 스크립트에서 한 프로세스의 PID를 다른 프로세스로 전달하는 방법은 무엇입니까?

동일한 쉘 스크립트에서 한 프로세스의 PID를 다른 프로세스로 전달하는 방법은 무엇입니까?

좋아요, 이것은 아마도 정말 어리석은 질문일 것입니다. 그리고 저는 쉘 스크립트를 자주 작성하지 않습니다. 쉘 스크립트에서 백그라운드에서 3개의 프로세스를 차례로 시작하려고 합니다. 예를 들면 다음과 같습니다.

#!/bin/sh
PROCESS1 &
PROCESS2 &
PROCESS3 &

그것이 문제이다. 표시된 것과 동일한 순서로 이러한 프로세스를 시작해야 합니다. 또한 PROCESS2의 PID는 PROCESS3에 명령줄 인수로 전달되어야 합니다. 이러한 모든 프로세스는 무한 루프에서 실행되며 3개의 별도 터미널에서 실행될 때 매우 원활하게 실행됩니다.

나는 시도했다:

#!/bin/sh
PROCESS1 &
PROCESS2 &
PID_PROCESS2=$!
PROCESS3 ${PID_PROCESS2} &

PROCESS1 및 PROCESS3이 시작되지만 PROCESS2는 오류를 인쇄하지 않고 즉시 종료됩니다. 방금 사라졌습니다. ps 명령은 PROCESS2의 흔적을 표시하지 않습니다. Print PID_PROCESS2는 "p" 값을 반환하고 PROCESS3은 "p" 값을 인수로 사용하여 잘 작동합니다. 나에게 문제나 단점이 있나요?

중요할 수 있는 세부정보

  1. 위의 예에서는 해당 프로세스를 호출하기 위해 정규화된 경로를 사용했습니다. 둘 다 기본 바이너리이며 동일한 디렉터리에 있습니다. 예를 들어,

     #!/bin/sh
     /usr/bin/PROCESS1 &
    

    ps의 출력은 위와 같습니다.

     $ps | grep "/path/to/PROCESS"
     10064 root 16536 S /path/to/PROCESS1
     10066 root 11084 S /path/to/PROCESS3 10065
    

    PROCESS2가 시작되었지만 알 수 없는 이유로 종료되었음을 명확하게 알려줍니다.

  2. PROCESS2는 단방향 통신인 FIFO(Named Pipe)를 통해 PROCESS1과 통신합니다.

해결책

#/bin/sh
/path/to/PROCESS1 &
/path/to/PROCESS2 & PROCESS2_PID=$!
export P2PID=${PROCESS2_PID}
sh -c "/path/to/PROCESS3 ${P2PID}"

이것은 sh가 작업을 수행하기 위한 추가 프로세스를 추가하는 것 같습니다.

$ps | grep "/path/to/PROCESS"
10174 root 16536 R /path/to/PROCESS1
10175 root 71720 S /path/to/PROCESS2
10177 root 27772 S sh -c /path/to/PROCESS3 10175
10076 root 11084 S /path/to/PROCESS3 100175

하지만 왜 이런 일이 일어나는지 아직도 모르겠습니다. 이 경우에 어떤 종류의 "마법"이 일어나고 있는지 제안할 수 있는 사람이 있습니까?

답변1

귀하의 설명에 따르면 PROCESS2가 종료되는 근본적인 버그가 있는 것 같습니다. 3개의 프로세스로 설명하는 것을 모델링하는 경우 백그라운드에서 3개의 프로세스를 실행한 다음 프로세스 2의 PID를 캡처하여 프로세스 3에 전달하면 기본적으로 예상대로 작동합니다.

샘플 스크립트
$ cat runny.bash
#!/bin/bash

proc3func() {
  echo $1
  sleep 7 &
}

sleep 9 &
sleep 8 &
PID2=$!
proc3func ${PID2} &
예시 실행
$ ./runny.bash ; sleep 2; ps -eaf
4279
UID        PID  PPID  C STIME TTY          TIME CMD
...
vagrant   4278     1  0 20:21 pts/1    00:00:00 sleep 9
vagrant   4279     1  0 20:21 pts/1    00:00:00 sleep 8
vagrant   4282     1  0 20:21 pts/1    00:00:00 sleep 7

위 출력에서 ​​PID 4279가 화면에 에코되고 후속 출력에 ps -eaf3개의 프로세스가 표시되는 것을 볼 수 있습니다.

디버그

set -x스크립트를 실행할 때 실행되는 명령을 따르거나 다음과 같이 실행할 수 있도록 활성화하는 것이 좋습니다 .

$ bash -x ./runny.bash
+ PID2=4612
+ sleep 9
+ sleep 8
+ proc3func 4612
+ echo 4612
4612
+ sleep 7

관련 정보