Как использовать команду тайм-аута в Linux
Хорошо, достаточно компьютерного времени. Вы можете ограничить время процессов, установив максимальное время, в течение которого они могут работать, с помощью команды timeout
. Вот руководство по установке ограничений на запуск программ с помощью этой команды.
Что делает тайм-аут для вас?
Команда timeout
позволяет вам установить ограничение на продолжительность работы программы. Но зачем вам это?
В одном случае вы точно знаете, как долго должен выполняться процесс. Обычный вариант использования – установить timeout
для управления программой ведения журнала или сбора данных, чтобы файлы журнала не занимали безжалостно место на жестком диске.
Другой случай — когда вы не знаете, как долго вы хотите, чтобы процесс выполнялся, но вы точно знаете, что не хотите, чтобы он выполнялся бесконечно. Возможно, у вас есть привычка запускать процессы, сворачивать окно терминала и забывать о них.
Некоторые программы, даже простые утилиты, могут генерировать сетевой трафик на уровне, который может снизить производительность вашей сети. Или они могут задействовать ресурсы на целевом устройстве, снижая его производительность. (ping
, я смотрю на вас.) Оставлять эти типы программ работать в течение длительного времени, пока вы находитесь вдали от компьютера, — плохая практика.
timeout
является частью GNU Core Utils , поэтому Linux и Unix-подобные операционные системы, такие как macOS, имеют встроенный тайм-аут. Устанавливать нечего; вы можете использовать его прямо из коробки.
Начало работы с тайм-аутом
Вот простой пример. Например, с параметрами командной строки по умолчанию команда ping
будет выполняться до тех пор, пока вы не остановите ее, нажав Ctrl+C. Если вы не прервете его, он просто продолжится.
ping 192.168.4.28
Используя timeout
, мы можем убедиться, что ping
не работает снова и снова, пережевывая пропускную способность сети и приставая к любому устройству, которое пингуется.
Следующая команда использует timeout
для ограничения времени ping
. Для ping
мы предоставляем 15 секунд времени выполнения.
timeout 15 ping 192.168.4.28
Через 15 секунд timeout
завершает сеанс ping
, и мы возвращаемся к приглашению командной строки.
Использование тайм-аута с другими единицами измерения времени
Обратите внимание, что нам не нужно было добавлять «s» после 15. timeout
предполагает, что значение указано в секундах. Вы можете добавить «s», но на самом деле это не имеет значения.
Чтобы использовать значение времени, измеряемое в минутах, часах или днях, добавьте «m», «h» или «d».
Чтобы запустить ping в течение трех минут, используйте следующую команду:
timeout 3m ping 192.168.4.28
ping
будет выполняться в течение трех минут, прежде чем timeout
включится и остановит сеанс ping
.
Ограничение сбора данных с тайм-аутом
Некоторые файлы захвата данных могут очень быстро увеличиваться. Чтобы такие файлы не становились громоздкими или даже создавали проблемы по размеру, ограничьте время работы программы захвата.
В этом примере мы используем tcpdump
, инструмент для захвата сетевого трафика. На тестовых машинах, на которых исследовалась эта статья, tcpdump
уже был установлен в Ubuntu Linux и Fedora Linux. Его нужно было установить на Manjaro Linux и Arch Linux с помощью следующей команды:
sudo pacman -Syu tcpdump
Мы можем запустить tcpdump
на 10 секунд с параметрами по умолчанию и перенаправить его вывод в файл с именем Capture.txt с помощью следующей команды:
timeout 10 sudo tcpdump > capture.txt
(tcpdump
имеет свои собственные параметры для сохранения перехваченного сетевого трафика в файл. Это быстрый способ, потому что мы обсуждаем timeout
, а не tcpdump
. .)
tcpdump
начинает захват сетевого трафика, и мы ждем 10 секунд. И 10 секунд приходят и уходят, а tcpdump
все еще работает, и Capture.txt все еще увеличивается в размере. Потребуется поспешное нажатие Ctrl+C, чтобы остановить tcpdump
.
Проверка размера файла capture.txt с помощью ls
показывает, что он вырос до 209 КБ за считанные секунды. Этот файл быстро рос!
ls -lh capture.txt
Что случилось? Почему timeout
не остановил tcpdump
?
Все дело в сигналах.
Посылка правильного сигнала
Когда timeout
хочет остановить программу, он отправляет сигнал SIGTERM. Это вежливо просит программу завершить работу. Некоторые программы могут игнорировать сигнал SIGTERM. Когда это происходит, нам нужно указать timeout
, чтобы он был немного более сильным.
Мы можем сделать это, попросив timeout
вместо этого отправить сигнал SIGKILL.
Сигнал SIGKILL нельзя «поймать, заблокировать или проигнорировать» — он всегда проходит. SIGKILL не вежливо просит программу остановиться. SIGKILL прячется за углом с секундомером и мотыгой.
Мы можем использовать параметр -s
(сигнал), чтобы указать timeout
для отправки сигнала SIGKILL.
timeout -s SIGKILL 10 sudo tcpdump > capture.txt
На этот раз по истечении 10 секунд tcpdump
останавливается.
Сначала вежливо спросите
Мы можем попросить timeout
попытаться остановить программу с помощью SIGTERM и отправить SIGKILL только в том случае, если SIGTERM не сработал.
Для этого мы используем опцию -k
(убить после). Опция -k
требует в качестве параметра значение времени.
В этой команде мы просим timeout
позволить dmesg
работать в течение 30 секунд, а затем завершить его сигналом SIGTERM. Если dmesg
все еще работает через 40 секунд, это означает, что дипломатический SIGTERM был проигнорирован, и timeout
должен отправить SIGKILL для завершения задания.
dmesg
— это утилита, которая может отслеживать сообщения кольцевого буфера ядра и отображать их в окне терминала.
timeout -k 40 30 dmseg -w
dmesg
работает в течение 30 секунд и останавливается, когда получает сигнал SIGTERM.
Мы знаем, что не SIGKILL остановил dmesg
, потому что SIGKILL всегда оставляет в окне терминала некролог из одного слова: «Убит». В данном случае этого не произошло.
Получение кода выхода программы
Программы с правильным поведением передают значение обратно в оболочку после завершения. Это называется кодом выхода. Обычно это используется, чтобы сообщить оболочке — или любому другому процессу, запустившему программу, — возникли ли проблемы во время выполнения программы.
timeout
предоставляет собственный код выхода, но нам это может быть безразлично. Вероятно, нас больше интересует код выхода из процесса, которым управляет timeout
.
Эта команда позволяет запустить ping
в течение пяти секунд. Он пингует компьютер под названием Nostromo, который находится в тестовой сети, которая использовалась для исследования этой статьи.
timeout 5 ping Nostromo.local
Команда выполняется в течение пяти секунд и timeout
завершает ее. Затем мы можем проверить код выхода с помощью этой команды:
echo $?
Код выхода — 124. Это значение timeout
использует для указания того, что программа была завершена с помощью SIGTERM. Если SIGKILL завершает программу, код выхода будет 137.
Если мы прервем программу с помощью Ctrl+C, код выхода из timeout
будет равен нулю.
timeout 5 ping Nostromo.local
echo $?
Если выполнение программы заканчивается до того, как timeout
завершит ее, timeout
может передать код выхода из программы обратно в оболочку.
Чтобы это произошло, программа должна остановиться сама по себе (другими словами, она не завершается по timeout
), и мы должны использовать --preserve-status
.
Если мы используем параметр -c
(count) со значением пять, ping
вызовет только пять запросов. Если мы зададим timeout
длительность в одну минуту, ping
определенно завершится сам по себе. Затем мы можем проверить значение выхода, используя echo
.
timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?
ping
завершает свои пять ping-запросов и завершает работу. Код выхода равен нулю.
Чтобы убедиться, что код выхода исходит от ping
, давайте заставим ping
сгенерировать другой код выхода. Если мы попытаемся отправить запросы ping на несуществующий IP-адрес, ping
завершится ошибкой с кодом выхода. Затем мы можем использовать echo
, чтобы убедиться, что код выхода не равен нулю.
timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?
Команда ping
, очевидно, не может связаться с несуществующим устройством, поэтому сообщает об ошибке и закрывается. Код выхода — два. Это код выхода, который ping
использует для общих ошибок.
Установка основных правил
timeout
предназначен для установления некоторых границ для запуска программ. Если есть опасность, что файлы журналов могут переполнить ваш жесткий диск или вы можете забыть, что оставили включенным сетевой инструмент, заверните их в timeout
и дайте компьютеру саморегулироваться.
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts