At или Выполнение, останов и повторный запуск процессов
8.4 В этом подразделе описывается:
как запустить команду в определенное время с помощью команд batch и at; как получить информацию о состоянии процесса; как завершить активный процесс; как вновь запустить остановленный процесс; как пренести процесс из оперативного в фоновый режим и наоборот.
8.4.1. Запуск команд в заданное время
Команды batch и at позволяют вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, вы это можете определить с помощью команды at. Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).
Команда batch очень полезна, если вы запускаете процесс или программу, которые занимают много системного времени. Команда batch представляет системе задание (содержащее последовательность команд для выполнения). Задание ставится в очередь и запускается как только у системы появляется возможность. Это позволяет системе быстро отвечать на запросы других пользователей. Общий формат команды batch:
batch<CR> первая команда<CR> . . . последняя команда<CR> <^d>
Если запускается только одна команда, то ее можно ввести в одной командной строке:
batch command_line<CR>
В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем справочнике и перенаправляет вывод в файл dol.file.
$ batch<CR> grep dollar * > dol.file<CR> <^d> job 155223141.b at Sun Dec 11:14:54 1989 $
После того как вы зададите задание batch, система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда вы запускаете команду в фоновом режиме.
Команда at позволяет вам указывать точное время выполнения команд. Общий фомат команды at:
at time<CR> первая команда<CR> . . . последняя команда<CR> <^d>
Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.
В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:
$ at 8:15am Feb 27<CR> banner happy birthday | mail emily<CR> <^d> $
Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.
Если вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at, указав ее с номером задания. Общий формат такой команды:
at -r jobnumber<CR>
Например, чтобы удалить предыдущее задание at, введите:
at -r 453400603.a<CR>
Если вы забыли номер задания, то команда :
at -l
распечатает вам список текущих заданий в очереди batch или at, как показано на следующем экране:
$ at -l<CR>CW user mylogin 168302040.a at Sat Nov 25 13:00:00 1989 user mylogin 453400603.a at Fri Feb 24 08:15:00 1989 $
Таким образом команда at выполняет команды в указанное время. Вы можете использовать от одной до 4-х цифр и буквосочетания "am" и "pm", чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.
Пример:
echo "shutdown -h now" | at -m 23:55 at 08:15am Feb 27 at 5:14pm Sept 24
8.4.2. Получить состояние запущенного процесса
Команда ps дает вам состояние всех процессов, запущенных на данный момент. Например, вы можете использовать команду ps, чтобы просмотреть состояние всех процессов, которые запущены в фоновом режиме, применив символ &.
В следующем подпункте обсуждается вопрос, как применить номер PID (идентификатор процесса), чтобы остановить выполнение команды. PID является уникальным номером, который система UNIX назначает каждому активному процессу.
В следующем примере команда grep запускается в фоновом режиме и затем выдается команда ps. Система сообщает в ответ номер идентификации процесса (PID) и номер терминала (TTY). Она также выдает время выполнения каждого процесса (TIME) и имя команды, которая выполняется (COMMAND):
$ grep word * > temp <CR> 28223 $ $ ps<CR> PID TTY TIME COMD 28124 tty10 0:00 sh 28223 tty10 0:04 grep 28224 tty10 0:04 ps $
Обратите внимание, что система распечатала номер PID для команды grep так же, как и для всех других запущенных процессов: для самой команды ps и команды sh, которая была запущена во время вашей регистрации.
Вы можете приостановить и вновь запустить программу, если в вашей системе предусмотрена функция управления заданиями. Команда jobs выдает список текущих фоновых процессов, запущенных или приостановленных. Команда jobs дополнительно к PID распечатывает идентификатор задания (JID) и имя задания. Чтобы вновь запустить приостановленное задание, либо возобновить фоновый процесс в оперативном режиме, вам необходимо знать JID. JID распечатывается на экране каждый раз, когда вы вводите команду запуска или останова процесса. Если вы введете:
jobs<CR>
то на экране появится следующая информация:
[JID] - Stopped (signal) <имя задания>
или
[JID] + Running <имя задания>
8.4.3. Завершение активных процессов
Команда kill завершает активные процессы в фоновом режиме и команда stop приостанавливает временно процессы. Общий формат этих команд:
kill PID<CR>
или
stop JID<CR>
Обратите внимание, что вы не можете завершать фоновые задания нажатием клавиш BREAK или DEL. Следующий пример показывает, как вы можете завершить команду grep, которая выполняется в фоновом режиме.
Пример.
$ kill 28223<CR> 28223 Terminated $
После того как система выдаст ответ на запрос, на экране появится подсказка $, означающая, что процесс завершен. Если система не найдет указанный PID, то появится сообщение об ошибке:
kill:28223:No such process
Чтобы приостановить оперативный процесс (если активна функция управления заданиями), введите:
ctrl Z
На экране появится следующее сообщение:
<JID> Stopped(user) <имя задания>
8.4.4. Запуск остановленного задания
Если функция управления заданиями активна, то вы можете вновь запустить приостановленный процесс. Чтобы вновь запустить процесс, остановленный командой stop, вы сначала должны определить JID с помощью команды jobs. Затем вы можете использовать JID со следующими командами:
fg <JID> - возобновляет приостановленное задание или переводит задание из фонового режима в оперативный; bg <JID> - вновь запускает приостановленное задание в фоновом режиме.
8.4.5. Использование команды nohup
Все процессы, за исключением at и batch, завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup. Команда nohup имеет следующий формат:
nohup command &<CR>
Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем справочнике строки "word" и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:
nohup grep word * > word.list & <CR>
Вы можете завершить команду nohup с помощью команды kill.
- Как запланировать одноразовые задания в Linux с помощью at:
- Установка в Linux
Команда at не является частью стандартных утилит Linux в большинстве дистрибутивов. К счастью, вы можете легко установить его с помощью менеджера пакетов, независимо от того, какой дистрибутив вы используете.
В системах на основе Debian, таких как Ubuntu, MX Linux и Pop!_OS, вы можете установить, выполнив:
sudo apt install at
Если вы используете дистрибутив на основе RPM, например RHEL, Fedora или Rocky Linux, используйте DNF для установки пакета:
sudo dnf install at
В дистрибутивах Linux на основе Arch, таких как Manjaro, запустите:
sudo pacman -S at
Запуск службы планировщика заданий atd Прежде чем использовать команду at, убедитесь, что запущен демон планирования atd. Это то, что команда at использует для выполнения запланированных заданий.
sudo systemctl status atd
Если служба atd не запущена, вы можете запустить ее, используя:
sudo systemctl start atd
Планирование задач в Linux с помощью at Вот как вы можете запланировать выполнение одноразового задания в определенный момент времени в будущем, используя at:
command | at time_stamp
Например, мы можем запланировать задачу для вывода списка содержимого вашего текущего каталога с помощью команды ls и записи вывода в файл через минуту.
Сначала перейдите в домашнюю папку пользователя с помощью команды cd:
cd ~
Затем выполните следующую команду, чтобы запланировать задачу:
ls > list_items.txt | at now + 1 minutes
В выводе будет указано, что ваша задача запланирована. По истечении времени вы можете перечислить содержимое вашего каталога, и должен появиться новый текстовый файл с содержимым каталога.
Если вы хотите выполнить команду завтра в полдень, запустите:
ls > list_items.txt | at noon tomorrow
Чтобы указать более точное время и дату, используйте формат даты MMDDHHMM YYYY. Например, чтобы выполнить предыдущую команду в 13:00. 25 декабря 2023 года вы можете запустить команду:
ls > list_items.txt | at 12251300 2023
Команда at имеет гораздо более продвинутые функции, которые позволяют вам запускать определенные команды в точное время. Взгляните на его справочные страницы для получения дополнительных параметров команды:
man at
Сценарии планирования в Linux с использованием at Помимо запуска отдельных команд, вы также можете использовать команду at для планирования выполнения сценариев в указанное время.
Предположим, у вас есть скрипт с именем disk_usage.sh, расположенный в вашей домашней папке. Сценарий просто выводит использование жесткого диска в текстовый файл. Вот сценарий:
#!/bin/bash df -h disk_usage.txt
Чтобы выполнить этот скрипт через тридцать минут, вы можете просто запустить следующую команду:
at now + 30 minutes -f ~/disk_usage.sh
Убедитесь, что ваш скрипт является исполняемым, задав ему соответствующий режим. Для этого вы можете использовать команду chmod:
chmod x disk_usage.sh
Управление ожидающими выполнения задач в Linux Вы можете просмотреть отложенные задачи, используя следующую команду:
atq
Чтобы удалить отложенную задачу, используйте следующий формат команды:
atrm task_number
Например, чтобы удалить задачу номер 12, используйте:
atrm 12
Автоматизируйте повторяющиеся задачи в Linux с помощью at