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.
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
où 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.
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
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
.