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
알아야 할 수 있습니다.listener1
listener2
while
또 다른 방법은 다음 과 같이 트랩을 정의하는 것입니다 listener.sh
.
trap 'kill "$!"' SIGUSR2
SIGUSR2
이를 구현하면 ( kill -s SIGUSR2 …
)를 프로세스에 보내면 자체적 listener.sh
으로 . 파일 덕분에 청취자의 PID를 이미 알고 있습니다 .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 공격에 취약합니다.