Comment utiliser la commande timeout sous Linux

Contenu

Ordinateur portable Linux affichant une invite bash

D'accord, assez de temps sur l'ordinateur. Vous pouvez donner des délais aux processus, l'établissement d'un temps maximum pouvant être exécuté avec le timeoutcommander. Voici un tutoriel pour mettre des limites sur l'exécution des programmes avec cette commande.

Qu'est-ce que le temps d'attente fait pour vous?

Les timeout la commande vous permet fixer une limite de temps un programme s'exécutera. Mais, Pourquoi voudriez-vous faire ça?

Un cas est celui où vous savez exactement combien de temps vous voulez qu'une procédure 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 consomment pas sans cesse l'espace de votre disque dur.

Un autre cas est celui où vous ne savez pas combien de temps vous voulez qu'une procédure s'exécute, mais tu sais que tu ne veux pas qu'il tourne indéfiniment. Vous avez peut-être l'habitude de configurer des processus en cours d'exécution, minimiser la fenêtre du terminal et les oublier.

Certains programmes, même des utilitaires simples, peut générer du trafic réseau à des niveaux susceptibles d'entraver les performances de votre réseau. Ou ils peuvent geler des ressources sur un appareil cible, qui ralentit vos performances. (ping, Je te regarde.) Laisser ces types de programmes s'exécuter pendant de longues périodes alors que vous n'êtes pas devant votre ordinateur est une mauvaise pratique..

timeout fait partie de Utilitaires de base GNU pour cela, Systèmes d'exploitation de type Linux et Unix, comme macOS, avoir un temps d'attente intégré. Il n'y a rien à installer; vous pouvez l'utiliser dès la sortie de la boîte.

A commencer par le temps d'attente

Voici un exemple simple. Par exemple, avec vos options de ligne de commande par défaut, les ping La commande s'exécutera jusqu'à ce que vous l'arrêtiez en appuyant sur Ctrl + C. Si vous n'interrompez pas, à suivre.

ping 192.168.4.28

Grâce à l'utilisation timeout, nous pouvons nous assurer ping ne fonctionne pas par intermittence, mâcher la bande passante du réseau et harceler tout appareil qui reçoit un ping.

Cette commande suivante utilise timeout au délai ping. Nous permettons 15 secondes d'exécution pour ping.

temps libre 15 ping 192.168.4.28

Après que 15 secondes timeout termine le ping session et revenir à la ligne de commande.

Utilisation du délai d'attente avec d'autres unités de temps

Notez que nous n'avons pas eu à ajouter un “s” Derrière 15. timeout suppose que la valeur est en secondes. Pourrait ajouter un “s”, mais ça ne change vraiment rien.

Pour utiliser une valeur de temps mesurée en minutes, heures ou jours, ajouter un “m”, ongle “h” ou un “ré”.

Pour que le ping s'exécute pendant trois minutes, utilisez la commande suivante:

délai d'attente 3m ping 192.168.4.28

ping fonctionnera pendant trois minutes avant timeout intervient et arrête le ping session.

session de ping exécutée sur un terminal veuf

Limiter la capture de données avec timeout

Certains fichiers de capture de données peuvent croître très rapidement. Pour éviter que de tels fichiers ne deviennent encombrants ou même de taille problématique, limiter la durée d'exécution du programme de capture.

Dans cet exemple, nous utilisons tcpdump, une capture du trafic réseau outil. Sur les machines de test, ce poste a été étudié sur, tcpdump il était déjà installé sur 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 vos options par défaut et redirigez votre sortie vers un fichier appelé capture.txt avec la commande suivante:

temps libre 10 sudo tcpdump > capture.txt

(tcpdump a ses propres options pour enregistrer le trafic réseau capturé dans un fichier. Ceci est un hack rapide parce que nous discutons timeout, non tcpdump.)

tcpdump commence à capturer le trafic réseau et nous attendons 10 secondes. ET 10 les secondes vont et viennent et tcpdump est toujours en cours d'exécution et capture.txt continue de croître en taille. Un Ctrl sera nécessaire + Hâte d'arrêter tcpdump.

Vérification de la taille de capture.txt avec ls montre qu'il est passé à 209K en quelques secondes. Ce fichier grossissait rapidement!

ls -lh capture.txt

Qu'est-ce qui s'est passé? Pourquoi pas timeout arrêter tcpdump?

Tout a à voir avec les signes.

Envoyer le bon signal

Lorsque timeout veut arrêter un programme, envoie le Signal SIGTERM. Cela demande poliment au spectacle de se terminer. Certains programmes peuvent choisir d'ignorer le signal SIGTERM.. Quand ça arrive, nous devons dire timeout être un peu plus énergique.

Nous pouvons le faire en demandant timeout envoyer le signal SIGKILL à la place.

Le signal SIGKILL ne peut pas être « capturé, bloqué ou ignoré", il arrive toujours. SIGKILL ne demande pas poliment au programme d'arrêter. SIGKILL se cache au coin de la rue avec un chronomètre et un cosh.

Nous pouvons utiliser le -s (signe) possibilité de compter timeout envoyer le signal SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

Cette fois, dès qu'ils se sont écoulés 10 secondes, tcpdump est arrêté.

Demandez poliment d'abord

Nous pouvons demander timeout pour essayer d'arrêter le programme en utilisant SIGTERM, et n'envoyez que SIGKILL si SIGTERM n'a pas fonctionné.

Pour faire ceci, nous utilisons le -k (tuer plus tard) option. Les -k L'option a besoin d'une valeur de temps comme paramètre.

Dans cette commande, nous demandons timeout laisser dmesg courir pour 30 secondes puis terminez-le avec le signal SIGTERM. Et dmesg fonctionne toujours après 40 secondes, signifie que le SIGTERM diplomatique a été ignoré et timeout vous devez envoyer SIGKILL pour terminer le travail.

dmesg est un utilitaire qui peut surveiller les messages de la mémoire tampon en anneau du noyau et les afficher dans une fenêtre de terminal.

délai d'attente -k 40 30 dmseg -w

dmesg fonctionne pour 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 parce que SIGKILL laisse toujours une notice nécrologique d'un mot dans la fenêtre du terminal: “Assassiné”. Cela ne s'est pas produit pour ce cas.

Récupérer le code de sortie du programme

Les programmes bien comportés renvoient une valeur au shell lorsqu'ils ont terminé. C'est ce qu'on appelle un code de sortie.. En général, ceci est utilisé pour dire au shell, ou toute procédure que le programme a démarré, si le programme a rencontré des problèmes lors de l'exécution.

timeout fournir votre propre code de sortie, mais il est possible que cela ne nous importe pas. Nous sommes probablement plus intéressés par le code de sortie de la procédure que par timeout contrôle.

Cette commande permet ping courir pendant cinq secondes. Vous envoyez un ping à un ordinateur appelé Nostromo, qui est sur le testnet qui a été utilisé pour rechercher ce post.

temps libre 5 ping Nostromo.local

La commande s'exécute pendant cinq secondes et timeout Terminez-le. Ensuite, nous pouvons vérifier le code de sortie en utilisant cette commande:

écho $?

Le code de sortie est 124. C'est la valeur timeout utilisé pour indiquer que le programme a été terminé en utilisant SIGTERM. Si SIGKILL termine le programme, le code de sortie est 137.

Si on interrompt le programme avec Ctrl + C le code de sortie de timeout est zéro.

temps libre 5 ping Nostromo.local
écho $?

Si l'exécution du programme se termine avant de timeout Terminez-le, timeout vous pouvez passer le code de sortie du programme au shell.

Pour que cela se produise, le programme devrait s'arrêter tout seul (En d'autres termes, c'est non terminé par timeout), et nous devons utiliser le --preserve-status option.

Si nous utilisons le -c (compter) option d'une valeur de cinq ping ne déclenchera que cinq demandes. Si nous donnons timeout une prolongation d'une minute, ping sera certainement fini tout seul. Ensuite, nous pouvons vérifier la valeur de sortie en utilisant echo.

timeout --preserve-status 1m ping -c 5 Nostromo.local
écho $?

ping termine ses cinq requêtes ping et 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. Ensuite, nous pouvons utiliser echo pour vérifier que le code de sortie est différent de zéro.

timeout --preserve-status 1m ping -c 5 PasIci.local
écho $?

Les ping évidemment, la commande ne peut pas atteindre un périphérique inexistant, donc il signale l'erreur et se ferme. Le code de sortie est deux. C'est le code de sortie ping utilise pour les erreurs générales.

Déterminer les règles de base

timeout il s'agit de fournir des limites à l'exécution de programmes. S'il y a un risque que des fichiers journaux envahissent votre disque dur ou oublient que vous avez laissé un outil réseau en cours d'exécution, enveloppez-les timeout et laissez votre ordinateur se réguler.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.