![스크립트에 의해 시작된 루프에 있는 프로세스의 PID](https://linux55.com/image/170824/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%20%EC%9D%98%ED%95%B4%20%EC%8B%9C%EC%9E%91%EB%90%9C%20%EB%A3%A8%ED%94%84%EC%97%90%20%EC%9E%88%EB%8A%94%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98%20PID.png)
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.sh
kill
aplay
/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 공격에 취약합니다.