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

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

netcat을 통해 다른 포트에 도착하는 오디오 스트림을 듣고 재생하기 위해 bash 스크립트를 통해 여러 프로세스를 시작했습니다.

#!/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번호( listener1등 )을 알아야 할 수도 있습니다.listener2


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

trap 'kill "$!"' SIGUSR2

이를 구현하면 SIGUSR2( )를 프로세스 kill -s SIGUSR2 …에 보내면 자체적인 을 갖게 됩니다 . 파일을 통해 이미 리스너의 PID를 알고 있습니다 .listener.shkillaplay/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 공격에 취약합니다.

관련 정보