web-dev-qa-db-ja.com

一定時間後にbashでアプリケーションを停止する

アプリケーション(この場合は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

任意の提案をいただければ幸いです。

5
SteveC

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秒間実行してから強制終了します。

11
user3140225

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 を参照してください。

最高の幸運

7
Raffa

これはおそらく最もエレガントな答えです(もちろん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を使用する必要があります。

3
confetti

この質問は、vlcコマンドを持たないシステムでtimeoutだけでなく、他のプログラムを停止したい人が見つけられると確信しています。ラファによって:

あなたの試みは、このスクリプトによって開始されたものだけでなく、システム内のすべてのvlcプロセスを強制終了します。代わりに、組み込みのkillを使用できます。これは、bashジョブ仕様を受け入れることができるためです。例えば:

#!/usr/bin/bash
vlc -vvv http://… &
sleep 10
kill %?vlc

& 2行目の演算子は、バックグラウンドを作成しますbash job。次にkill %?vlcは、接頭辞がvlcであるbash jobを強制終了します。

1
liori