좋아요, 이것은 아마도 정말 어리석은 질문일 것입니다. 그리고 저는 쉘 스크립트를 자주 작성하지 않습니다. 쉘 스크립트에서 백그라운드에서 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" 값을 인수로 사용하여 잘 작동합니다. 나에게 문제나 단점이 있나요?
중요할 수 있는 세부정보
위의 예에서는 해당 프로세스를 호출하기 위해 정규화된 경로를 사용했습니다. 둘 다 기본 바이너리이며 동일한 디렉터리에 있습니다. 예를 들어,
#!/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가 시작되었지만 알 수 없는 이유로 종료되었음을 명확하게 알려줍니다.
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 -eaf
3개의 프로세스가 표시되는 것을 볼 수 있습니다.
디버그
set -x
스크립트를 실행할 때 실행되는 명령을 따르거나 다음과 같이 실행할 수 있도록 활성화하는 것이 좋습니다 .
$ bash -x ./runny.bash
+ PID2=4612
+ sleep 9
+ sleep 8
+ proc3func 4612
+ echo 4612
4612
+ sleep 7