스크립트에 의해 시작된 루프 내 프로세스의 PID

스크립트에 의해 시작된 루프 내 프로세스의 PID

bash 스크립트를 통해 시작된 여러 프로세스가 있으며, netcat을 통해 별도의 포트에 도착하는 오디오 스트림을 듣고 재생합니다.

#!/bin/bash
# listener.sh

while :
do
    nc -l 900$1 | aplay - 
    sleep 1
done

exit 0

이 스크립트는 고유한 포트를 정의하는 인수와 함께 다른 스크립트에서 시작됩니다. 예.

    #!/bin/bash
    # startlisterners.sh

    if [ ! -f /tmp/listener1.pid ]; then
         nohup  listener.sh 1 &
        echo $! > /tmp/listener1.pid
    fi
    if [ ! -f /tmp/listener2.pid ]; then
         nohup  listener.sh 2 &
         echo $! > /tmp/listener2.pid
    fi

    ..... etc.

    exit 0

첨자 자체는 실행 상태를 유지하면서 첨자에서 "aplay" 인스턴스를 선택적으로 제거할 수 있어야 하는 경우가 주기적으로 필요합니다.

각 플레이 프로세스의 개별 PID에 어떻게 액세스할 수 있나요?

답변1

대신에

nc -l 900$1 | aplay - 
sleep 1

달리다

nc -l "900$1" | aplay - &
   # here you can use $!
wait
sleep 1

이제 읽는 곳에서 미리 정의된 파일에 # here you can use $!쓸 수 있습니다 . $!이 접근 방식에서는 올바른 번호의 파일을 사용할 수 있도록 해당 번호( 등) 를 listener.sh알아야 할 수 있습니다.listener1listener2


while또 다른 방법은 다음 과 같이 트랩을 정의하는 것입니다 listener.sh.

trap 'kill "$!"' SIGUSR2

SIGUSR2이를 구현하면 ( kill -s SIGUSR2 …)를 프로세스에 보내면 자체적 listener.sh으로 . 파일 덕분에 청취자의 PID를 이미 알고 있습니다 .killaplay/tmp/listener*.pid

신경쓰세요매뉴얼말한다:

Bash가 명령이 완료되기를 기다리고 트랩이 설정된 신호를 받으면 명령이 완료될 때까지 트랩이 실행되지 않습니다. Bash가 내장을 통해 비동기 명령을 기다리고 있을 때 wait트랩이 설정된 신호를 수신하면 내장이 즉시 트랩이 실행된 후 wait보다 큰 종료 상태로 반환 됩니다.128

이는 위와 같이 aplay백그라운드에서 실행해야 함을 의미합니다 .wait


여러 클라이언트에 서비스를 제공할 수 있도록 여러 리스너를 실행한다고 추측할 수 있습니다(주어진 시간에 포트당 최대 하나의 클라이언트만 가능). 그런 다음 aplay클라이언트가 자동으로 사라지고 nc알림을 받지 못하는 경우와 같이 때때로 kill 을 수행해야 합니다 .

아마도 이전체접근 방식은 다음 하나로 대체될 수 있습니다 socat.

socat TCP-LISTEN:9001,fork EXEC:'aplay -'

덕분에 fork동일한 포트에서 여러 클라이언트에 서비스를 제공할 수 있습니다. 오래된 연결을 종료하려면 -T옵션( 참조 ) 을 사용하십시오 man 1 socat. 없어도-T결국 시간 초과그래도. 그러나 이 솔루션은 DOS 공격에 취약합니다.

관련 정보