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 timeout
commander. 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.
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
durant 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, il 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.