Fatmawati Achmad Zaenuri / Shutterstock.com
OK, c’est assez de temps informatique. Vous pouvez donner des limites de temps aux processus, en définissant une durée maximale pendant laquelle ils peuvent s’exécuter avec le timeout
commander. Voici un didacticiel pour limiter l’exécution de programmes avec cette commande.
Que fait le timeout pour vous?
La timeout
la commande vous permet de fixer une limite à la durée un programme fonctionnera pour. Mais pourquoi tu veux faire ça?
Un cas est celui où vous savez exactement combien de temps vous voulez qu’un processus s’exécute. Un cas d’utilisation courant est d’avoir timeout
contrôler un programme de journalisation ou de capture de données afin que les fichiers journaux ne dévorent pas sans relâche l’espace de votre disque dur.
Un autre cas est celui où vous ne savez pas combien de temps vous voulez qu’un processus s’exécute, mais vous savez que vous ne voulez pas qu’il s’exécute indéfiniment. Vous pouvez avoir l’habitude de configurer les processus en cours d’exécution, de minimiser la fenêtre du terminal et de les oublier.
Certains programmes, même de simples utilitaires, peuvent générer du trafic réseau à des niveaux qui peuvent nuire aux performances de votre réseau. Ou ils peuvent immobiliser les ressources sur un appareil cible, ce qui ralentit ses performances. (ping
, Je vous regarde.) Laisser ces types de programmes s’exécuter pendant de longues périodes alors que vous êtes loin de votre ordinateur est une mauvaise pratique.
timeout
fait partie de la Utils GNU Core donc les systèmes d’exploitation de type Linux et Unix tels que macOS ont tous un délai d’expiration intégré. Il n’y a rien à installer; vous pouvez l’utiliser dès la sortie de la boîte.
Premiers pas avec timeout
Voici un exemple simple. Par exemple, avec ses options de ligne de commande par défaut, le ping
La commande s’exécutera jusqu’à ce que vous l’arrêtiez en appuyant sur Ctrl + C. Si vous ne l’interrompez pas, cela continuera.
ping 192.168.4.28
En utilisant timeout
, nous pouvons nous assurer ping
ne fonctionne pas indéfiniment, grignotant la bande passante du réseau et harcelant le périphérique auquel un ping est envoyé.
Cette prochaine commande utilise timeout
à la limite de temps ping
. Nous accordons 15 secondes de temps d’exécution pour ping
.
timeout 15 ping 192.168.4.28
Après 15 secondes timeout
termine le ping
session et nous revenons à l’invite de ligne de commande.
Utilisation du délai d’expiration avec d’autres unités de temps
Notez que nous n’avons pas eu à ajouter un «s» derrière le 15. timeout
suppose que la valeur est en secondes. Vous pouvez ajouter un «s», mais cela ne fait vraiment aucune différence.
Pour utiliser une valeur de temps mesurée en minutes, heures ou jours, ajoutez un «m», un «h» ou un «d».
Pour exécuter le ping pendant trois minutes, utilisez la commande suivante:
timeout 3m ping 192.168.4.28
ping
fonctionnera pendant trois minutes avant timeout
intervient et arrête le ping
session.
Limitation de la capture de données avec timeout
Certains fichiers de capture de données peuvent grossir très rapidement. Pour éviter que ces fichiers deviennent trop lourds ou même problématiques en taille, limitez la durée pendant laquelle le programme de capture est autorisé à s’exécuter.
Dans cet exemple, nous utilisons tcpdump
, une capture du trafic réseau outil. Sur les machines de test sur lesquelles cet article a été étudié, tcpdump
était déjà installé dans Ubuntu Linux et Fedora Linux. Il devait être installé sur Manjaro Linux et Arch Linux, avec la commande suivante:
sudo pacman -Syu tcpdump
Nous pouvons courir tcpdump
pendant 10 secondes avec ses options par défaut, et redirigez sa sortie vers un fichier appelé capture.txt avec la commande suivante:
timeout 10 sudo tcpdump > capture.txt
Qu’est-il arrivé? Pourquoi pas timeout
Arrêtez tcpdump
?
Tout est à voir avec les signaux.
Envoyer le bon signal
Quand timeout
veut arrêter un programme, il envoie le Signal SIGTERM. Cela demande poliment au programme de se terminer. Certains programmes peuvent choisir d’ignorer le signal SIGTERM. Quand cela arrive, nous devons dire timeout
pour être un peu plus énergique.
Nous pouvons le faire en demandant timeout
pour envoyer le signal SIGKILL à la place.
Le signal SIGKILL ne peut pas être «capté, bloqué ou ignoré» – il passe toujours. SIGKILL ne demande pas poliment au programme de s’arrêter. SIGKILL se cache au coin de la rue avec un chronomètre et une cosh.
Nous pouvons utiliser le -s
(signal) option pour dire timeout
pour envoyer le signal SIGKILL.
timeout -s SIGKILL 10 sudo tcpdump > capture.txt
Demander poliment d’abord
Nous pouvons demander timeout
pour essayer d’arrêter le programme en utilisant SIGTERM, et de n’envoyer SIGKILL que si SIGTERM ne fonctionnait pas.
Pour ce faire, nous utilisons le -k
(tuer après) option. La -k
L’option nécessite une valeur de temps comme paramètre.
Dans cette commande, nous demandons timeout
laisser dmesg
pendant 30 secondes, puis terminez-le avec le signal SIGTERM. Si dmesg
fonctionne toujours après 40 secondes, cela signifie que le SIGTERM diplomatique a été ignoré et timeout
devrait envoyer SIGKILL pour terminer le travail.
dmesg
est un utilitaire qui peut surveiller les messages du tampon en anneau du noyau et affichez-les dans une fenêtre de terminal.
timeout -k 40 30 dmseg -w
dmesg
fonctionne pendant 30 secondes et s’arrête lorsqu’il reçoit le signal SIGTERM.
Nous savons que ce n’est pas SIGKILL qui s’est arrêté dmesg
car SIGKILL laisse toujours une notice nécrologique d’un mot dans la fenêtre du terminal: «Tué». Cela ne s’est pas produit dans ce cas.
Récupération du code de sortie du programme
Les programmes bien comportés retransmettent une valeur au shell lorsqu’ils se terminent. C’est ce qu’on appelle un code de sortie. Généralement, ceci est utilisé pour indiquer au shell – ou à tout autre processus qui a lancé le programme – si des problèmes ont été rencontrés par le programme lors de son exécution.
timeout
fournit son propre code de sortie, mais nous ne nous en soucions peut-être pas. Nous sommes probablement plus intéressés par le code de sortie du processus qui timeout
contrôle.
Cette commande permet ping
courir pendant cinq secondes. Il envoie un ping à un ordinateur appelé Nostromo, qui se trouve sur le réseau de test qui a été utilisé pour rechercher cet article.
timeout 5 ping Nostromo.local
La commande s’exécute pendant cinq secondes et timeout
y met fin. Nous pouvons ensuite vérifier le code de sortie à l’aide de cette commande:
echo $?
Le code de sortie est 124. C’est la valeur timeout
utilise pour indiquer que le programme a été arrêté à l’aide de SIGTERM. Si SIGKILL met fin au programme, le code de sortie est 137.
Si nous interrompons le programme avec Ctrl + C, le code de sortie de timeout
est zéro.
timeout 5 ping Nostromo.local
echo $?
Si l’exécution du programme se termine timeout
le termine, timeout
peut renvoyer le code de sortie du programme au shell.
Pour que cela se produise, le programme doit s’arrêter de lui-même (en d’autres termes, il se termine par timeout
), et nous devons utiliser le --preserve-status
option.
Si nous utilisons le -c
(count) option avec une valeur de cinq ping
ne déclenchera que cinq demandes. Si nous donnons timeout
une durée d’une minute, ping
sera définitivement terminé par lui-même. Nous pouvons ensuite vérifier la valeur de sortie en utilisant echo
.
timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?
ping
termine ses cinq requêtes ping et se termine. Le code de sortie est zéro.
Pour vérifier que le code de sortie provient de ping
, forçons ping
pour générer un code de sortie différent. Si nous essayons d’envoyer des requêtes ping à une adresse IP inexistante, ping
échouera avec un code de sortie d’erreur. On peut alors utiliser echo
pour vérifier que le code de sortie est différent de zéro.
timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?
La ping
La commande ne peut évidemment pas atteindre le périphérique inexistant, elle signale donc l’erreur et se ferme. Le code de sortie est deux. Ceci est le code de sortie ping
utilise pour les erreurs générales.
Établir des règles de base
timeout
Il s’agit de fournir des limites à l’exécution des programmes. S’il y a un danger que les fichiers journaux dépassent votre disque dur ou que vous oubliez que vous avez laissé un outil réseau en cours d’exécution, enveloppez-les dans timeout
et laissez votre ordinateur s’autoréguler.