Cette réponse à la commande de ligne de commande pour tuer automatiquement une commande après un certain temps
propose une méthode sur une ligne pour expirer une commande de longue durée à partir de la ligne de commande bash:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Mais il est possible qu'une commande "de longue durée" donnée se termine plus tôt que le délai d'expiration. (Appelons-la une commande "généralement longue mais parfois rapide" ou tlrbsf pour le plaisir.)
Donc, cette approche astucieuse à 1 doublure a quelques problèmes. Tout d'abord, le sleep
n'est pas conditionnel, ce qui définit une limite inférieure indésirable sur le temps nécessaire à la séquence pour se terminer. Considérez 30s ou 2m ou même 5m pour le sommeil, lorsque la commande tlrbsf se termine en 2 secondes - hautement indésirable. Deuxièmement, le kill
est inconditionnel, donc cette séquence tentera de tuer un processus non en cours et de se plaindre.
Alors...
Existe-t-il un moyen de temporiser une commande généralement longue mais parfois rapide ( "tlrbsf" ) qui
- a une implémentation bash (l'autre question a déjà des réponses Perl et C)
- se terminera à la première des deux: fin du programme tlrbsf , ou délai d'expiration
- ne tuera pas les processus non existants / non en cours d'exécution (ou, facultativement: ne se plaindra pas d'un mauvais kill)
- ne doit pas être un doublure
- peut fonctionner sous Cygwin ou Linux
... et, pour les points bonus, exécute la commande tlrbsf au premier plan et tout processus "sleep" ou supplémentaire en arrière-plan, de telle sorte que la commande stdin / stdout / stderr de la commande tlrbsf peut être redirigée, comme si elle avait été courir directement?
Si oui, veuillez partager votre code. Sinon, veuillez expliquer pourquoi.
J'ai passé un certain temps à essayer de pirater l'exemple susmentionné, mais j'atteins la limite de mes compétences bash.
timeout
utilitaire GNU ?
timeout
c'est super! vous pouvez même utiliser avec plusieurs commandes (script multi-lignes): stackoverflow.com/a/61888916/658497