Вот вы пользователь Linux машины. И вот вам захотелось запустить какую-нибудь команду только на определенное время, и вы задаете вопрос - как это сделать? А вот как - использовать команду timeout
.
Как взять timeout - об использовании команды
Базовый синтаксис
Как и следовало ожидать, синтакс у команды экстремально прост: сама команда timeout - опции - длительность выполнения (можно даже с единицами измерения) - целевая команда
Единицы измерения для указания длительности:
- s - секунды (стоит по умолчанию)
- m - минуты
- h - часы
- d - дни
Если вы не укажете никакого параметра по длительности, команда не будет активирована.
Примеры команд:
timeout 5 ping 1.1.1.1
- пингуем 1.1.1.1 5 секундtimeout 5m ping 1.1.1.1
- пингуем 1.1.1 5 минутtimeout 5.5h ping 1.1.1.1
- 5,5 часов пингуем 1.1.1
Если у вас есть необходимость, можно запустить команду с добавкой sudo
(если для целевой команды требуются права суперпользователя):
sudo timeout 100 tcpdump -n -w dump.pcap
Сообщение с космосом или отправка определенного сигнала исполняемому процессу
Если вы не указали какой-то особый сигнал, по умолчанию передается SIGTERM (сигнал о том, что надо бы мягко терминировать процесс). Однако, если вы укажете ключ -s после команды timeout, вы можете указать любой другой допустимый сигнал. К примеру: sudo timeout -s SIGKILL ping 1.1.1.1
или sudo timeout -s 9 ping 1.1.1.1
Обе команды выше идентичны, и если вы хотите увидеть весь список сигналов, просто введите kill -l
Как убить процесс, если он завис
Как вы уже поняли, SIGTERM - это сигнал, который отправляется после истечения таймаута, но он легко может быть проигнорирован процессом, и тогда процесс не остановится. Для уверенности в смерти процесса, нужно использовать ключ -k и некое временное значение. Тогда после окончания таймаута будет отправляться сигнал SIGKILL, который процесс не сможет проигнорировать при всем желании. В примере ниже команда выполняется одну минуту, и, если в течение 10 секунд после окончания таймаута она не "умирает", отправляется сигнал SIGKILL и "добивает" процесс:
sudo timeout -k 10 1m ping 1.1.1.1
Сохраняем статус
Команда timeout всегда возвращает значение 124 после истечения указанного времени или возвращает статус "exit" управляемой команды (той, что вы вводите после команды timeout). Таким образом, вы можете использовать ключ --preserve-status
:
timeout --preserve-status 10 ping 1.1.1.1
Запуск команды явно, а не за кулисами
По умолчанию, timout работает в бэкграунде, и если вы хотите обратного (вдруг после запуска управляемой команды потребуется какой-нибудь пользовательский ввод), нужно использовать ключ -foreground:
timeout --foreground 10m ./bestscripteva.sh
Заключение
В 99% процентов случаев команда timeout требует всего двух аргументов и ни одного факта: времени исполнения и самой исполняемой команды. Однако, вы теперь знаете и другие фишки использования этой замечательной команды.