アプリケーション(この場合はVLC)を起動するbashスクリプトを実行し、一定時間実行してから停止することに興味があります。このスクリプトを使用して、このアプリケーションを正常に起動できますが、停止しません。
#!/usr/bin/bash
vlc -vvv http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}"
sleep 10
killall vlc
ストリームの記録を停止しないだけでなく、ヒットした後にアプリがフリーズすることがあります Ctrl+Z。
任意の提案をいただければ幸いです。
timeout
コマンドを使用して、時間制限付きのコマンドを実行できます。基本的な構文は次のとおりです。
timeout DURATION COMMAND
ここで、DURATION
は、サフィックスs
(秒)、m
(分)、h
(時間)またはd
(日)のサフィックスを持つ浮動小数点数です。 COMMAND
は、実行するコマンドです。
あなたの場合、あなたは使うことができます:
timeout 10s vlc -vvv http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}"
コマンドを10秒間実行してから強制終了します。
2行目の後に&
を追加して、VLC
を次のようにバックグラウンドに配置します。
#!/usr/bin/bash
vlc -vvv http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}" &
sleep 10
killall vlc
そしてそれは動作します。
説明:
シェル/ターミナルは、スクリプトにリストされている順序でコマンドを実行し、実行が完了する前のコマンドのみが次のコマンドに移動します。
これは、VLC
コマンドには当てはまりません。 VLC
が実行されている限り、シェル/ターミナルはそれがまだ実行中であると見なし、その後のコマンドに移動せず、実行が完了するのを待ちます(つまり、この場合、VLC
window/instance)。
これを回避するには、VLC
をバックグラウンドに送信し、スクリプトの次のコマンドのためにシェル/ターミナルのプロンプトを解放します。これは、コマンドの後に&
を追加することで実行できます。
お知らせ:
冗長オプション-vvv
を削除して、スクリプトが完全に終了しないようにします。
ただし、冗長オプション-vvv
add Nohup
を使用する必要がある場合は、次のように2行目の前に追加します。
#!/usr/bin/bash
Nohup vlc -vvv http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}" &
sleep 10
killall vlc
これにより、可能な場合は現在の作業ディレクトリのNohup.out
というファイルに出力が追加され、そうでない場合は~/Nohup.out
に出力が追加され、スクリプトが完全に終了します。
詳細は man Nohup を参照してください。
最高の幸運
これはおそらく最もエレガントな答えです(もちろんVLCでのみ機能します)。
#!/usr/bin/bash
vlc -vvv --stop-time 10 --play-and-exit http://10.0.0.113:8000/stream.mjpg --sout="#std{access=file,mux=ogg,dst=/home/whsrobotics/vlc_project/first_try.mp4}"
--stop-time 10
10秒後に再生を停止します--play-and-exit
再生停止後にVLCを終了します(デフォルトは--no-play-and-exit
)
場合によっては、--run-time
ではなく--stop-time
を使用する必要があります。
この質問は、vlc
コマンドを持たないシステムでtimeout
だけでなく、他のプログラムを停止したい人が見つけられると確信しています。ラファによって:
あなたの試みは、このスクリプトによって開始されたものだけでなく、システム内のすべてのvlc
プロセスを強制終了します。代わりに、組み込みのkill
を使用できます。これは、bashジョブ仕様を受け入れることができるためです。例えば:
#!/usr/bin/bash
vlc -vvv http://… &
sleep 10
kill %?vlc
&
2行目の演算子は、バックグラウンドを作成しますbash job。次にkill %?vlc
は、接頭辞がvlc
であるbash jobを強制終了します。