Comment utiliser la commande timeout sous Linux

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 la commande timeout. Voici un tutoriel pour limiter l’exécution des programmes avec cette commande.

Que fait le timeout pour vous?

La commande timeout 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 le contrôle du délai d’expiration d’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 du 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.

Mise en route avec timeout

Voici un exemple simple. Par exemple, avec ses options de ligne de commande par défaut, la commande ping 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

ping 192.168.4.28 dans une fenêtre de terminal

En utilisant le délai d’expiration, nous pouvons nous assurer que le ping ne s’exécute pas indéfiniment, en augmentant la bande passante du réseau et en harcelant le périphérique auquel le ping est soumis.

  Comment sauvegarder un site WordPress sur Linux

Cette commande suivante utilise le délai d’expiration pour limiter le temps de ping. Nous autorisons 15 secondes de temps d’exécution pour le ping.

timeout 15 ping 192.168.4.28

timeout 15 ping 192.168.4.28 dans une fenêtre de terminal

Après 15 secondes, le délai d’expiration met fin à la session ping et nous revenons à l’invite de ligne de commande.

session de ping terminée dans une fenêtre de terminal

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

timeout 3m ping 192.168.4.28 dans une fenêtre de terminal

ping s’exécutera pendant trois minutes avant le délai d’expiration et arrête la session ping.

session de ping en cours d'exécution dans une veuve de terminal

Limitation de la capture de données avec timeout

Certains fichiers de capture de données peuvent grossir très rapidement. Pour éviter que de tels fichiers ne 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, un 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

sudo pacman -Syu tcpdump dans une fenêtre de terminal

Nous pouvons exécuter tcpdump pendant 10 secondes avec ses options par défaut, et rediriger sa sortie vers un fichier appelé capture.txt avec la commande suivante:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump> capture.txt dans une fenêtre de terminal ”width =” 646 ″ height = ”77 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ” onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p><p> (tcpdump a ses propres options pour enregistrer le trafic réseau capturé dans un fichier. C’est un hack rapide car nous ‘ concernant le délai d’expiration, pas tcpdump.) </p><p> tcpdump commence à capturer le trafic réseau et nous attendons 10 secondes. Et 10 secondes vont et viennent et tcpdump est toujours en cours d’exécution, et capture.txt continue de croître en taille. Il faudra un Ctrl + C précipité pour arrêter tcpdump. </p><p> Vérifier la taille de capture.txt avec ls montre qu’il est passé à 209K en quelques secondes. Ce fichier se développait rapidement! </p><pre> ls -lh capture.txt </pre><p> <img loading =

Qu’est-il arrivé? Pourquoi le timeout n’a-t-il pas arrêté tcpdump?

  Comment installer l'émulateur LinApple Apple II sous Linux

Tout est à voir avec les signaux.

Envoyer le bon signal

Lorsque 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. Lorsque cela se produit, nous devons dire à timeout d’être un peu plus énergique.

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

Le signal SIGKILL ne peut pas être «capturé, 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 l’option -s (signal) pour indiquer le délai d’attente pour envoyer le signal SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump> capture.txt dans une fenêtre de terminal ”width =” 646 ″ height = ”167 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ” onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p><p> Cette fois, dès que 10 secondes se sont écoulées, tcpdump est arrêté. </p><p> < chargement img =

Demander poliment d’abord

Nous pouvons demander à timeout d’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 l’option -k (tuer après). L’option -k nécessite une valeur de temps comme paramètre.

Dans cette commande, nous demandons timeout pour laisser dmesg s’exécuter pendant 30 secondes, puis le terminer avec le signal SIGTERM. Si dmesg est toujours en cours d’exécution après 40 secondes, cela signifie que le SIGTERM diplomatique a été ignoré et que le délai d’expiration doit 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

timeout -k 40 30 dmseg -w dans une fenêtre de terminal

dmesg fonctionne pendant 30 secondes et s’arrête lorsqu’il reçoit le signal SIGTERM.

Sortie de dmesg dans une fenêtre de terminal

Nous savons que ce n’est pas SIGKILL qui a arrêté dmesg car SIGKILL laisse toujours une notice nécrologique d’un seul 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. En règle générale, 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.

  Comment recadrer des images par lots sur Windows 10

timeout fournit son propre code de sortie, mais cela ne nous intéresse peut-être pas. Nous sommes probablement plus intéressés par le code de sortie du processus contrôlé par timeout.

Cette commande permet au ping de s’exécuter 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

timeout 5 ping Nostromo.local dans une fenêtre de terminal

La commande s’exécute pendant cinq secondes et le délai d’expiration la termine. Nous pouvons ensuite vérifier le code de sortie à l’aide de cette commande:

echo $?

sortie de ping et echo $? dans une fenêtre de terminal

Le code de sortie est 124. Il s’agit de la valeur utilisée par timeout 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 $?

timeout 5 ping Nostromo.local dans une fenêtre de terminal en utilisant Ctrl + C

Si l’exécution du programme se termine avant que timeout ne la 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 n’est pas terminé par timeout), et nous devons utiliser l’option –preserve-status.

Si nous utilisons l’option -c (count) avec une valeur de cinq, le ping ne déclenchera que cinq requêtes. Si nous donnons au timeout une durée d’une minute, le 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 $?

timeout --preserve-status 1m ping -c 5 Nostromo.local dans une fenêtre de terminal

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 du ping, forçons le ping à générer un code de sortie différent. Si nous essayons d’envoyer des demandes de ping à une adresse IP inexistante, le ping échouera avec un code de sortie d’erreur. On peut alors utiliser echo pour vérifier que le code de sortie est non nul.

timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?

timeout --preserve-status 1m ping -c 5 NotHere.local dans une fenêtre de terminal

La commande ping ne peut évidemment pas atteindre le périphérique inexistant, elle signale donc l’erreur et se ferme. Le code de sortie est deux. Il s’agit du code de sortie utilisé par ping pour les erreurs générales.

Établir des règles de base

timeout consiste à fournir des limites à l’exécution des programmes. S’il y a un danger, les fichiers journaux peuvent surcharger votre disque dur ou que vous pourriez oublier que vous avez laissé un outil réseau en cours d’exécution, mettez-les dans le délai d’attente et laissez votre ordinateur s’autoréguler.