web-dev-qa-db-fra.com

Arrêter une application en bash après une certaine quantité de temps

Je suis intéressé à exécuter un script Bash qui commence une application (dans ce cas de VLC), exécutez-la pendant une certaine quantité de temps, puis arrêtez-la. Je peux obtenir cette application pour commencer à bien, mais cela ne s'arrêtera pas, en utilisant ce script:

#!/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

Non seulement il n'arrête pas l'enregistrement du flux, mais l'application semble geler parfois après avoir frappé Ctrl+Z.

Toute suggestion est appréciée.

6
SteveC

Vous pouvez utiliser la commande - timeout pour exécuter une commande avec une limite de temps. Sa syntaxe de base est la suivante:

timeout DURATION COMMAND

DURATION est un numéro de point flottant avec le suffixe s pendant des secondes, m pendant des minutes, h pendant des heures ou d pendant des jours et COMMAND est la commande que vous souhaitez exécuter.

Dans votre cas, vous pouvez utiliser:

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}"

pour exécuter votre commande pendant 10 secondes, puis le tuer.

11
user3140225

Ajouter & Après la deuxième ligne de mettre VLC en arrière-plan comme suit:

#!/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

et cela fonctionnera.


Explanation:

La coquille/terminal exécutera des commandes dans l'ordre dans lequel ils sont répertoriés dans le script et ne passeront à la commande suivante que si la commande avant de finir d'exécuter.

Ce qui n'est pas le cas dans votre commande VLC. Tant que VLC est en cours d'exécution, la coque/terminal jugera qu'il s'exécutera toujours et ne passera pas à la commande après cela, mais plutôt attendre qu'il finit de terminer l'exécution (c.-à-d. Dans ce cas, fermez la fermeture de VLC fenêtre/instance).

Une solution de contournement Il s'agit d'envoyer VLC à l'arrière-plan et libérez l'invite Shell/Terminal pour la commande suivante dans le script. Qui peut être fait en ajoutant & après la commande.


AVIS:

  • Supprimer l'option de verbosité -vvv Pour éviter le script ne sortant pas proprement et complètement.

  • Si, toutefois, vous devez utiliser l'option de verbosité -vvv Ajouter Nohup avant la deuxième ligne aussi bien comme:

#!/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

Cela ajoutera la sortie à un fichier appelé Nohup.out Dans le répertoire de travail actuel si possible ou à ~/Nohup.out Sinon et permettra au script de se terminer proprement et complètement.

Voir Man Nohup pour information.

Bonne chance

7
Raffa

Je suis à peu près sûr que cette question soit trouvée par les personnes qui souhaitent arrêter d'autres programmes, pas seulement vlc sur des systèmes qui n'ont pas la commande timeout, donc en prolongement de la réponse déjà générique par raffa:

Votre tentative tuerait tous les processus vlc dans le système, pas seulement celui qui a commencé par ce script. Au lieu de cela, vous pouvez utiliser le kill _ intégré, car il peut accepter une spécification de travail Bash. Par exemple:

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

Le & L'opérateur de la deuxième ligne créera un arrière-plan BASH JOB. Puis kill %?vlc va tuer le Bash Job dont le préfixe est vlc.

1
liori