次のように、3つのvlcコマンドを同時に(Ubuntu Server 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)をキャプチャする方法を見つける必要があります。
利用可能$!
変数に。
気づく別の変数に保存する必要があります。コマンドを呼び出すたびに更新されるからです。この場合後で2番目のスクリプトで使用できるファイルに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
2番目のスクリプト(と呼びます)は、以前に作成されたファイルに書き込まれた内容が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
(または使用する)各ポートに対して2番目のスクリプトを実行できます。./s2.sh v2 5657
やや複雑なアプローチは、各ポートに対応する名前でディレクトリを作成することです。ディレクトリロックPIDを含むロックファイルを配置し、スクリプト自体からそのディレクトリの削除コマンドをキャプチャしてから、後でディレクトリが存在することを確認してください。ここでヒントを確認してください
これにより、単一cvlc
の同時スクリプトのみがそのインスタンスを作成し、そのポートで実行できます。
アップデート:コメント1件ps -ef | grep '5657'
Q:PIDを確認するために他のコマンドを使用するのではなく、PIDを保存することが推奨されるのはなぜですか?回答:通常、プロセスのPIDは一意であり、出力に使用する文字列が他のコマンドで使用されていないかどうかを事前にgrep
知ることはできませんps
。したがって、PIDが存在します:)