in

Comment utiliser la commande timeout sous Linux

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 timeoutcommander. 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

ping 192.168.4.28 dans une fenêtre de terminal

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

timeout 15 ping 192.168.4.28 dans une fenêtre de terminal

Après 15 secondes timeout termine le ping session et nous revenons à l’invite de ligne de commande.

session 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 fonctionnera pendant trois minutes avant timeout intervient et arrête le ping session.

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 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

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

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

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>(<code>tcpdump</code> a ses propres options pour enregistrer le trafic réseau capturé dans un fichier.  C’est un hack rapide car nous discutons <code>timeout</code>, ne pas <code>tcpdump</code>.)</p>
<p><code>tcpdump</code>  commence à capturer le trafic réseau et nous attendons 10 secondes.  Et 10 secondes vont et viennent et <code>tcpdump</code> est toujours en cours d’exécution, et capture.txt continue de croître.  Il va falloir un Ctrl + C précipité pour s’arrêter <code>tcpdump</code>.</p>
<p>Vérification de la taille de capture.txt avec <code>ls</code> montre qu’il est passé à 209K en quelques secondes.  Ce fichier grandissait rapidement!</p>
<pre>ls -lh capture.txt</pre>
<p><img loading=

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

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, <code>tcpdump</code> est arrêté.</p>
<p><img loading=

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

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 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

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

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 $?

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

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 $?

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

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 $?

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 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 $?

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

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Débutant Geek: Explication des partitions de disque dur

Débutant Geek: Explication des partitions de disque dur

Comment supprimer un mot que vous avez ajouté au dictionnaire sous Mac OS X

Comment supprimer un mot que vous avez ajouté au dictionnaire sous Mac OS X