Pure bash
intégré, sans coreutils
J'ai constaté que cette solution fonctionne dans bash
en s'appuyant sur un intégré sans appeler un exécutable externe. Il fonctionne sur des systèmes sur lesquels n'a pas été installé le logiciel de gestion de l'environnement. 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 avec &
son PID est stocké dans la variable interne $!
(présent dans la version moderne de dash
, csh
, bash
, tcsh
, zsh
...).
Ce qui fait vraiment la différence entre les coquilles, c'est la présence du intégré 命令 read
[ 2 ] et de l'option -t
. Dans la première version, si l'utilisateur ne complète pas une ligne d'entrée avant le nombre de secondes spécifié, l'instruction sera interrompue et un code de retour d'erreur sera généré.
-t TIMEOUT Provoque un délai de lecture et renvoie un échec si une ligne complète d'entrée n'est pas lue dans les secondes TIMEOUT.
La deuxième version fonctionne comme la première mais vous pouvez interrompre le délai d'exécution en appuyant simplement sur enter .
En effet, l'opérateur ou ||
exécute le kill
uniquement si le read
se termine avec un code de retour différent de zéro, comme lorsque le délai d'attente est expiré. Si vous appuyez sur enter avant ce moment, il retournera 0 et il ne tuera pas votre commande précédente.
Solutions Coreutils [ 1 ]
Quand coreutils sont présents sur votre système et vous n'avez pas besoin d'économiser le temps et les ressources pour appeler un programme externe, timeout
y sleep
et sont tous deux des moyens parfaits pour atteindre votre objectif.
timeout
L'utilisation de timeout
est simple.
Eventuellement, vous pouvez envisager d'utiliser aussi le -k
pour envoyer un signal kill supplémentaire si le premier échoue.
timeout 5m YourCommand # 3rd version
sleep
Avec sleep
vous pouvez utiliser votre imagination ou prendre des inspirations [ 3 ] . Notez que vous pouvez laisser votre commande en arrière-plan ou en avant-plan (par ex. 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
Explications
- Dans la 4ème version, vous exécutez en arrière-plan
YourCommand
puis votre Shell sleep
s pendant 5 minutes. Lorsqu'il sera terminé, le dernier processus d'arrière-plan ( $!
) seront tués. Vous arrêtez votre Shell.
- Dans la 5e version, vous exécutez plutôt en arrière-plan
YourCommand
et vous stockez immédiatement ce PID dans la variable $pid
. Ensuite, vous exécutez en arrière-plan un sieste de 5 minutes et sa commande conséquente qui tuera ce PID stocké. Comme vous avez envoyé ce groupe de commandes en arrière-plan, vous n'arrêtez pas votre Shell. Vous avez besoin de stocker le PID dans une variable parce que la valeur de $!
peut être mis à 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 bash Shell qui se suicidera dans 5 minutes via
$$
alors c'est votre commande qui est exécutée et qui reste au premier plan.
- Dans la 7ème version, il est invoqué un sous-shell
()
qui stocke son PID dans une variable ( cmdpid
) et se tue avec un autre sous-shell envoyé en exécution d'arrière-plan, puis lancez VotreCommande en avant-plan.
Bien sûr, dans chaque version, vous pouvez envoyer le signal de mise à mort dont vous avez besoin, du signal par défaut au signal de mise à mort. extrême kill -9
à n'utiliser que lorsque cela est vraiment nécessaire.
Références
- [ 1 Les Coreutils
- [ 2 Le guide du débutant Bash
- [ 3 ] Le BashFAQ