Создать будильник с помощью atd linux

Обновлено: 06.07.2024

В Linux есть специальный демон — cron, позволяющий выполнять программы по расписанию. В этой статье мы научим вас пользоваться этим демоном.
Очень часто нужно периодически выполнять одни и те же действия. Например, каждый день проверять обновление антивируса (или раз в неделю — в зависимости от того, как часто выходят для него обновления) или каждые 30 минут — почту. Можно выполнять эти действия самому, но это не совсем удобно.

Представьте, что ваш рабочий день будет начинаться с команды запуска программы обновления антивируса, а каждые 30 минут вы будете вводить программу проверки почты. Во-первых, не это не очень удобно, а во-вторых, можно легко забыть выполнить ту или иную команду. Например, в пятницу вечером вы можете забыть выполнить команду создания резервной копии, а в понедельник утром что-то случится с сервером, и вы не досчитаетесь всего пользовательского каталога. Не очень приятно, правда?

Параметр SHELL задает имя программы-оболочки, параметр PATH — пусть поиска программ. Кроме этих параметров, могут также использоваться параметры MAILTO и НОМЕ. Параметр MAILTO задает имя пользователя, которому будет отправлен отчет о выполнении расписания, а НОМЕ — домашний каталог crond.
Но самое главное — не эти параметры, а собсвенно таблица расписаний. В нашем случае она выглядит так:
17 * * * * root run-parts —report /etc/сгоп.hourly 25 б * * * root run-parts —report /etc/cron.daily 47 б * * 7 root run-parts —.report /etc/cron.weekly 52 б 1 * * root run-parts —report /etc/cron.monthly

Согласно этой таблице каждый час будут выполняться программы из каталога /etc/cron.hourly, каждый день — из каталога /etc/cron.daily, каждую неделю — из каталога /etc/cron.weekly, и раз в месяц — из каталога /etc/cron.monthly.

Правда, удобно? Но иногда нам нужно создать более гибкое расписание. Например, мы хотим, чтобы одна программа выполнялась в 7 часов утра, а другая в 7:20, Тут простым добавлением сценария в каталог /etc/cron.daily уже не отделаешься. Чтобы создать такое расписание, вам нужно изучить формат записей таблицы расписаний. А формат следующий:
мин. (0-59) часы (0-23) день (1-31) месяц (1-12) день (0-6, 0-Вс) команда

Чтобы реализовать наше расписание, нам нужно добавить в /etc/crontab следующие строки:
0 7 * * * /usr/bin/commandl arguments 20 7 * * * /usr/bin/command2 arguments

Первая команда будет запускаться каждый день в 7 часов утра, а вторая команда будет запускаться тоже каждый день, но в 7:20.

Аналогичная ситуация и с еженедельным запуском. Программы будут запущены не только в 4:22 утра, но еще и в воскресенье. На выходные вы точно выключите свой сервер (хотя это зависит от политики организации — ведь во многих организациях выключают на выходные все компьютеры). Поэтому целесообразно назначить запуск на понедельник в 8 часов 22 минуты:
22 8 * * 1 root nice -n 19 run-parts —report /etc/cron.weekly

С ежемесячным запуском вроде бы все нормально: программы будут выполняться в 4:42 первого числа каждого месяца. Хотя время можно было бы и изменить на 8:42:
42 8 1 * * root nice -n 19 run-parts —report /etc/cron.monthly

Иногда нужно просто выполнить определенные команды в определенное время (разово), поэтому редактировать таблицу crontab не совсем уместно. Данную задачу можно решить более рационально. Убедитесь, что у вас установлен и запущен демон atd. После этого введите команду
at [дата]

Затем просто вводите команды, которые вы хотите выполнить в указанное время. Для завершения ввода нажмите комбинацию клавиш + . Время указывается в АМ/РМ-формате, например, если вам нужно выполнить команды в 14:00, то вы должны ввести команду:
at 2pm

Просмотреть очередь заданий можно командой atq, а удалить какое-либо задание — командой atrm.

Здравия!
Подскажите, пож-ста, буде есть такое в природе, программу, которая вызывалась бы в ком. строке и параметром бы было системное время, по ближайшему совпадению которого она сделает некое действие или просто успешно завершится. Неплохо в ожидании в фон уйти.
Просьба не предлагать:
1) crontab - дважды напрягаться, сначала пуск, потом стоп, так как надо однократно.
2) писать скрипт с проверкой date на соответствие, но если нет готового, то буду так.
3) sleep (время события минус тек. время)

Вспомнил, был такой, я его в debian всегда удалял)) Потому что он демоном висит, ресурсы занимает (хоть и малые), а нужен не был никогда до сих пор. Спасибо.

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

Тем не менее, был не нужен)) Запустил, оно самое, спасибо.

Вот чего ему не хватает, этому at, так это возможности хоть коротенько промаркировать задание. Чтоб по просмотру очереди заданий (atq) у каждого было осмысленное описание. И по срабатыванию бы неплохо. А то чего там в своё время назапускал, вспоминай теперь. Вроде по man нет такой возможности.
Это только, похоже, в графических органайзерах есть такое?

По срабатыванию описание научился добавлять, таким образом, нашёл в сети:

описания протоколом не предусмотрены, так что придётся смириться.

Или написать средней сложности скриптик — обёртку вокруг at, который будет вести базу описаний по номерам задач, и предоставлять доступ к этой базе.

Что-то случилось с at-подсистемой, вроде раньше было нормально, а сейчас вразнобой выдаёт задания. Понятно, что можно sort натравливать, но это ж ненормально. Никто не замечал? Причём ладно бы по дате, так и по номеру задания.
$ atq 1759 Wed Nov 25 11:05:00 2020 a globus 1760 Wed Nov 25 15:10:00 2020 a globus 1761 Wed Nov 25 23:00:00 2020 a globus 1762 Thu Nov 26 16:35:00 2020 a globus 1763 Thu Nov 26 23:00:00 2020 a globus 1764 Fri Nov 27 07:25:00 2020 a globus 1765 Fri Nov 27 18:50:00 2020 a globus 1766 Fri Nov 27 19:35:00 2020 a globus 1767 Sat Nov 28 06:55:00 2020 a globus 1768 Sat Nov 28 12:25:00 2020 a globus 1769 Sat Nov 28 19:50:00 2020 a globus 1771 Sun Nov 29 15:10:00 2020 a globus 1772 Sun Nov 29 20:00:00 2020 a globus 1742 Sat Nov 21 20:05:00 2020 a globus 1743 Sun Nov 22 10:20:00 2020 a globus 1745 Sun Nov 22 14:05:00 2020 a globus 1746 Sun Nov 22 15:00:00 2020 a globus 1747 Sun Nov 22 20:00:00 2020 a globus 1754 Mon Nov 23 11:00:00 2020 a globus 1755 Mon Nov 23 16:30:00 2020 a globus 1756 Mon Nov 23 23:00:00 2020 a globus 1757 Tue Nov 24 13:30:00 2020 a globus 1758 Tue Nov 24 23:00:00 2020 a globus 1770 Sun Nov 29 09:15:00 2020 a globus

Получается что демон усыновляет все запущенные процессы. Запускаю по заданию скрипт вызывающий оболочку bash и в котором в цикле дремит sleep.

Пробую остановить демон, чтобы остановить выполнение скрипта:

sudo systemctl stop atd
ps -o ppid=,comm= -p 3875
1 atd

init усыновил все процессы как при запуске с nohup

Добавлено (19:45):

Кроме того если в nohup используется лог файл в текущей директории то в at такую же роль играет файл в диретории
/var/spool/at/spool/
Это хорошо видно в предыдущем выводе команды lsof, в самом конце списка


В качестве альтернативы планировщику заданий cron существуют разные команды, включая команду at, которая позволяет вам планировать выполнение команды один раз в заданное время без редактирования файла конфигурации.

Требование этой команды состоит в установке этой утилиты, и включении ее выполнения:

Затем запустите и добавьте службу at в автозагрузку.

Проверьте состояние at.

at


at

Если вы решите не использовать параметр -m, команда будет выполнена, но в выводе ничего не будет напечатано. Однако вы можете использовать перенаправление вывода в файл.

Кроме того, обратите внимание, что at не только позволяет использовать следующие фиксированные времена: вот например, в полдень (12:00) и в полночь (00:00), но также и с 2-значным (с указанием часов) и 4-значным временем (часы и минуты).

Например

Чтобы запустить updateb в 23 часа сегодня (или завтра, если текущая дата больше 11 часов), выполните:

Чтобы отключить систему в 23:55 сегодня (применяются те же критерии, что и в предыдущем примере):


Вы также можете отсрочить выполнение на минуты, часы, дни, недели, месяцы или годы, используя знак + и указать необходимое время, как в первом примере.

Формат указание времени (спецификации времени) соответствуют стандарту POSIX.

Выводы

Как правило, лучше использовать at вместо планировщика заданий cron всякий раз, когда вы хотите запустить команду или выполнить задание в заданное время только один раз. Для других случаев используйте cron.

Спасибо за уделенное время на прочтение статьи!

Если возникли вопросы, задавайте их в комментариях.

Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!

Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Cisco от Академии Cisco, курсы Linux от Linux Professional Institute на платформе SEDICOMM University.

Favorite

Добавить в избранное

Главное меню » Linux » Планирование заданий в Linux с помощью команды at

Как запланировать публикацию ваших постов в WordPress (шаг за шагом)

К оманда at в Linux может использоваться для планирования заданий, которые не выполняются по регулярному расписанию.

Это можно сравнить с концепцией Crontab в Linux, которая является лучшим способом автоматизации повторяющихся задач.

В этой статье мы покажем, как вы можете использовать команду «at» для планирования выполнения задач и команд на определенное время в будущем.

Установка по команде в Linux

Прежде чем начать, вы должны проверить, установлено ли «at» в вашей системе. Он не установлен по умолчанию во всех операционных системах.

Вы можете проверить это, набрав:

Если программное обеспечение уже установлено, вернется номер версии. Если нет, его можно установить в системах на основе Debian, набрав:

Если вы используете другой дистрибутив Linux, то вам, возможно, придется изменить эту команду, чтобы отразить менеджер пакетов, используемый вашим дистрибутивом.

Начало

Утилита at на самом деле представляет собой серию команд, которые работают вместе для планирования заданий. Как мы уже упоминали, at предпочтительнее для ситуаций, когда ваша задача больше «одноразовая», чем повторяющееся событие.

Мы составили таблицу с некоторыми основными командами, связанными с at.

команда функция
at позволяет пользователю планировать задачу
atq выводит список заданий в очередь для вошедшего в систему пользователя или всех пользователей, если они запускаются как sudo
atrm удаляет задания по указанному номеру задания
batch указывает системе запускать задание только в указанное время, если загрузка системы находится на определенном уровне (средняя загрузка <1,5)

Использование команды at в Linux для планирования заданий

Использование at имеет свой уникальный формат. Когда вы хотите запланировать работу, вы наберете в свой терминал:

Время является обязательным, но дата является необязательной. Если ничего не введено, будет сделано предположение на основе текущей даты и системного времени.

Когда вы нажмете Enter, вам будет предложено ввести команды. Вы можете ввести столько, сколько хотите. Введите Ctrl + D, чтобы сохранить и выйти.

Позвольте нам показать это вам с примерами.

Пример 1. Введите время/дату, используя естественный язык

У вас есть много разных вариантов ввода времени. В отличие от crontab с его довольно сложной системой, основанной на звездочках, «at» распознает «человеческий» ввод более эффективно.

Есть много человеческих подобных выражений, которые могут быть поняты с помощью программного обеспечения. Многие из них зависят от региона. Он может распознавать такие распространенные выражения, как «полночь» или «полдень». Он также может различать AM и PM. Кроме того, он может распознавать различные форматы для дней и дат, включая сокращения.

Он также может использовать выражение «сейчас». Вы можете просто ввести команду, как показано ниже, и она будет запущена через 5 минут.

Итак, прошло около минуты, верно? Проверьте каталог для нового файла.

Пример 2. Использование указанного времени/даты

Для своей первой работы вы использовали «относительное» время «now + [time]». Это очень простой способ составить график работы, но вам может потребоваться конкретнее.

На этот раз давайте наметим 2 задания в разное время.

Вы можете использовать файл message.txt (созданный в предыдущем примере) для демонстрации. Каждое задание заменит содержимое файла.

Вы можете проверить текущее время в вашей системе Linux с помощью команды date.

Настройте первую работу на определенное время (через 5 минут):

Настройте второе задание на определенное время (через 10 минут):

Проверьте в 3:45:

Проверьте в 3:50:

Пример 3. Просмотр всех заданий в очереди с помощью atq

В любое время вы можете проверить запланированные задания с помощью команды atq. В нем будут перечислены все текущие запланированные задания для пользователя, вошедшего в систему. Чтобы просмотреть все задания в системе, вам может потребоваться использование повышенных привилегий.

Каждое задание идентифицируется по идентификатору задания, назначенному времени и связанному пользователю.

Вы также можете просмотреть содержимое запланированного задания с опцией -c:

Пример 4. Удаление запланированного задания с помощью atrm

Если вы решите отменить задание до его выполнения, это можно сделать, набрав команду с соответствующим идентификатором задания (который можно получить с помощью команды atq).

Как видите, задание 11 было удалено из очереди.

Пример 5: использование файла для команды at

Возможно, у вас есть набор сценариев, которые вы хотите выполнять нерегулярно, и cron не подходит. Вы можете ввести несколько заданий без использования стандартного ввода.

Давайте представим сценарий, в котором отдел кадров запрашивает документацию для компьютерной деятельности сотрудника, который, по их мнению, нарушает политику работы. Возможно, вы захотите, чтобы определенные журналы активности или другая историческая информация создавали для вас отчет в указанное время.

Вы можете сэкономить время, перечислив необходимые сценарии в текстовом файле, выполнив их с помощью at.

Пример 6. Запуск задания, когда загрузка процессора падает ниже порогового значения.

Пакетные задания будут выполняться, когда средняя загрузка ЦП по умолчанию опустится ниже 1,5.

Метод ввода пакетных заданий идентичен «at», за исключением того, что ему не нужно указывать время.

Если вы хотите изменить порог загрузки, вы можете сделать это с помощью следующей команды:

Вывод

Спасибо за прочтение. Мы надеемся, что ваше понимание команды улучшилось. Если у вас есть какие-либо вопросы или вы хотите поделиться тем, как вы используете эту команду, сообщите нам! Оставьте комментарий ниже.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: