Поиск по сайту:

Как использовать команду тайм-аута в 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 и дайте компьютеру саморегулироваться.

RELATED: Best Linux Laptops for Developers and Enthusiasts