다음과 같이 세 개의 vlc 명령을 동시에 (Ubuntu 서버 14.04에서) 실행하는 작은 스크립트가 필요합니다.
#!/bin/sh
cvlc -vvv v1 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5656,access=http}"
cvlc -vvv v2 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5657,access=http}"
cvlc -vvv v3 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5658,access=http}"
3개의 VLC 명령을 실행하는 스크립트에 대한 완벽한 방법이 필요합니다(모든 명령은 동시에 백그라운드에서 자동으로 실행되어야 합니다).
또한 위 스크립트가 실행 중인지(위 스크립트의 모든 vlc 명령이 실행 중인지) 확인하고 중지되거나 충돌하는 경우 다시 시작하려면 다른 스크립트가 필요합니다.
미리 감사드립니다
모래탑
답변1
screen을 사용하여 백그라운드에서 bash 스크립트를 실행할 수 있습니다.
아래 관련 기사를 확인해 보세요.
https://www.howtoforge.com/linux_screen
http://www.tecmint.com/screen-command-examples-to-manage-linux-terminals/
https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/
당신은 그것을 사용할 수 있습니다감시 장치명령을 계속 실행하세요. 서비스가 충돌하면 시작됩니다.
답변2
이것을 시도해 보는 것은 어떻습니까?북면 주문 &
"nohup"은 로그아웃 후 프로세스가 종료되지 않음을 보장하고 끝에 "&"가 있으면 전체 명령이 백그라운드에서 실행된다는 것을 보장합니다.
답변3
백그라운드에서 프로세스를 보내는 일반적인 방법은 &
명령 뒤에 연산자를 사용하는 것입니다(Glenn이 제안한 대로).
일정 시간이 지난 후 프로세스의 상태를 구별할 수 있으려면 해당 PID를 알아야 합니다. 따라서 PID
방금 시작된 프로세스(프로세스 ID)를 캡처할 수 있는 방법을 찾아야 합니다 .
사용 가능$!
변수 에.
알아채다다른 변수에 저장해야 합니다.명령을 호출할 때마다 업데이트되기 때문입니다. 이 경우나중에 두 번째 스크립트에서 사용할 수 있는 파일에 PID를 저장할 수 있습니다..
보관하기 좋은 곳인 것 같습니다 /var/lock/yourscripdirectory/lock
.
이 디렉터리는 재부팅할 때마다 자동으로 정리됩니다.
첫 번째 스크립트(라고 부르겠습니다 s1.sh
)는 명령을 실행하고 PID를 저장해야 하며 다음 스크립트와 유사할 수 있습니다.
#!/bin/sh
MyLockDir="/var/lock/${0##*/}"
mkdir -P # it creates if needed the directory
# /var/lock/yourscriptname without its path
cvlc -vvv v1 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5656,access=http}" &
echo $! >${MyLockDir}/5656 # here you store in the file 5656 the PID
cvlc -vvv v2 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5657,access=http}" &
echo $! >${MyLockDir}/5657
cvlc -vvv v3 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5658,access=http}" &
echo $! >${MyLockDir}/5658
두 번째 스크립트(라고 부르겠습니다 )는 이전에 생성된 파일에 작성된 내용이 s2.sh
프로세스에 포함되어 있는지 확인해야 합니다 . PID
아직 실행 중인지 확인하고 필요한 경우 업데이트해야 합니다. 다음 줄에서 힌트를 얻으세요.
#!/bin/sh
MyPort=$2
MyLockDir="/var/lock/s1.sh"
mypid="$(cat ${MyLockDir}/${MyPort})"
ps -p $mypid > /dev/null;
if [ $? == 0 ] ;
then # Running
echo "# It runs ... " ; # or whatever you want
else # NOT Running
cvlc -vvv $1 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:$MyPort,access=http}" &
echo $! >${MyLockDir}/$MyPort
fi
예를 들어, 필요한 ./s2.sh v1 5656
(또는 사용하는) 각 포트에 대해 두 번째 스크립트를 실행할 수 있습니다../s2.sh v2 5657
약간 더 복잡한 접근 방식은 각 포트에 대해 해당 이름으로 디렉터리를 만드는 것입니다.디렉토리 잠금PID가 포함된 잠금 파일을 넣고 스크립트 자체에서 해당 디렉터리에 대한 삭제 명령을 캡처한 다음 나중에 디렉터리가 존재하는지 확인하세요.여기에서 팁을 확인하세요
이렇게 하면 단 하나 cvlc
의 동시 스크립트만 해당 인스턴스를 생성하고 해당 포트에서 실행할 수 있습니다.
업데이트: 댓글 1개ps -ef | grep '5657'
Q: PID 를 확인하기 위해 다른 명령을 사용하는 대신 PID를 저장하는 것이 권장되는 이유는 무엇입니까 ? 답변: 일반적으로 프로세스의 PID는 고유하며 출력에 사용하는 문자열이 다른 명령에서 사용 grep
되지 않는지 미리 알 수 없습니다 ps
. 따라서 PID가 존재합니다 :)