Cette réponse à Commande de ligne de commande pour tuer automatiquement une commande après un certain temps
propose une méthode en une ligne pour définir une durée limite pour une commande longue à partir de la ligne de commande bash :
( /chemin/vers/commande_lente avec options ) & sleep 5 ; kill $!
Mais il est possible qu'une commande "longue" donnée se termine plus tôt que le délai d'expiration.
(Appelons cela une commande "longue-généralement-longue-mais-parfois-rapide", ou tlrbsf pour s'amuser.)
Cette approche astucieuse en une ligne présente quelques problèmes.
Premièrement, le sleep
n'est pas conditionnel, ce qui impose une limite inférieure indésirable au temps nécessaire pour que la séquence se termine. Envisagez 30s ou 2m ou même 5m pour le sleep, lorsque la commande tlrbsf se termine en 2 secondes — très indésirable.
Deuxièmement, le kill
est inconditionnel, donc cette séquence tentera de tuer un processus non en cours d'exécution et râlera à ce sujet.
Donc...
Y a-t-il un moyen de définir une durée limite pour une commande "longue-généralement-longue-mais-parfois-rapide" ("tlrbsf") qui
- dispose d'une implémentation bash (l'autre question dispose déjà de réponses en Perl et en C)
- se terminera au premier des deux cas : la terminaison du programme tlrbsf, ou la fin du délai
- ne tuera pas les processus inexistants/non en cours d'exécution (ou, en option : ne se plaindra pas d'un kill erroné)
- n'a pas besoin d'être en une ligne
- peut s'exécuter sous Cygwin ou Linux
... et, pour des points bonus
- exécute la commande tlrbsf en premier plan
- aucun 'sleep' ou processus supplémentaire en arrière-plan
de manière à ce que l'entrée standard/sortie standard/erreur standard de la commande tlrbsf puisse être redirigée, comme si elle avait été exécutée directement ?
Si c'est le cas, veuillez partager votre code. Sinon, veuillez expliquer pourquoi.
J'ai passé un certain temps à essayer de modifier l'exemple mentionné précédemment mais j'atteins la limite de mes compétences en bash.
5 votes
Une autre question similaire : stackoverflow.com/questions/526782/… (mais je pense que la réponse 'timeout3' ici est bien meilleure).
2 votes
Toute raison de ne pas utiliser l'utilitaire
timeout
de GNU?2 votes
timeout
est génial! vous pouvez même l'utiliser avec plusieurs commandes (script multi-ligne) : stackoverflow.com/a/61888916/658497