Pure bash
construit, sans coreutils
J'ai trouvé que cette solution fonctionne en bash
s'appuyant sur une commande intégrée sans appeler un exécutable externe. Cela fonctionne sur le système où finalement ne sont même pas installés les coreutils [ 1 ]
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
Explications : comme d' habitude lorsque vous envoyez une commande en arrière - plan &
, son PID est stocké dans la variable interne $!
(présent dans la version moderne dash
, csh
, bash
, tcsh
, zsh
...).
Ce qui fait vraiment la différence entre les obus est la présence de la commande intégrée read
[ 2 ] et de l’option -t
. Dans la 1ère version, si l'utilisateur ne complète pas une ligne d'entrée avant le nombre de secondes spécifié, l'instruction est terminée et un code de retour d'erreur est généré.
-t TIMEOUT Cause la lecture pour expirer et renvoyer l'échec si une ligne complète d'entrée n'est pas lue dans les délais TIMEOUT.
La deuxième version fonctionne comme la 1ère mais vous pouvez abandonner le délai de mise à mort en appuyant simplement sur enter.
En effet, l'opérateur ou ||
n'exécute l' kill
instruction que si la read
commande se termine avec un code retour différent de zéro, par exemple lorsque le délai d'attente a expiré. Si vous appuyez enteravant ce moment, il renverra 0 et il ne tuera pas votre commande précédente.
Solutions Coreutils [ 1 ]
Lorsque coreutils sont présents sur votre système et vous avez pas besoin d'économiser le temps et les ressources nécessaires pour appeler un programme externe, timeout
et sleep
et sont les deux moyens parfaits pour atteindre votre objectif.
timeout
L'utilisation de timeout
est simple.
En fin de compte, vous pouvez également utiliser l' -k
option permettant d'envoyer un signal de neutralisation supplémentaire si le premier échoue.
timeout 5m YourCommand # 3rd version
sleep
Avec sleep
vous pouvez utiliser votre fantaisie ou prendre des inspirations [ 3 ] . Notez que vous pouvez laisser votre commande en arrière-plan ou au premier plan (par exemple, il top
doit généralement être au premier plan).
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
Des explications
- Dans la 4ème version, vous exécutez en tâche de fond
YourCommand
votre shell sleep
pendant 5 minutes. Quand il sera fini, le dernier processus d'arrière-plan ( $!
) sera tué. Vous arrêtez votre coquille.
-
Dans la 5ème version, vous exécutez plutôt en arrière
YourCommand
- plan et vous stockez immédiatement ce PID dans la variable $pid
. Ensuite, vous exécutez en arrière-plan une sieste de 5 minutes et la commande qui en découle qui va tuer ce PID stocké. Comme vous avez envoyé ce groupe de commandes en arrière-plan, vous n'arrêtez pas votre shell. Vous devez stocker le PID dans une variable, car la valeur de $!
peut être mise à jour par l'exécution éventuelle d'un autre programme en arrière-plan. En termes simples, vous évitez le risque de tuer le mauvais processus ou aucun processus du tout.
- Dans la 6ème version, il s’agit d’un nouveau shell bash qui se suicidera dans 5 minutes via
$$
, puis il exécutera votre commande qui reste au premier plan.
- Dans la 7ème version, il est appelé un sous
()
- shell qui stocke son PID dans une variable ( cmdpid
) et se détruit avec un autre sous-shell envoyé en exécution en arrière-plan, puis lance votre commande au premier plan.
Bien sûr, dans chaque version, vous pouvez envoyer le signal de suppression dont vous avez besoin, de la valeur par défaut à l’ extrême kill -9
, pour n’être utilisé que lorsque vous en avez vraiment besoin.
Références
- [ 1 ] Les Coreutils
- [ 2 ] Le Guide du débutant Bash
- [ 3 ] Le BashFAQ