Планирование задач

Основные планировщики

  • Наиболее распространенным планировщиком является cron

    • cron - демон, который запускает процессы на основании заданной регулярности

    • Работает с различными конфигурационными файлами, определяющими, когда процесс должен быть запущен

  • At используется для разовой задачи

  • Альтернативно можно использовать systemd таймеры

Описание cron

  • Пользовательские задачи для cron задаются командой crontab -e

    • Задается для того пользователя, из под которого запущен планировщик

  • Базовые параметры хранятся в /etc/cron.d

    • Устаревший путь - /etc/crontab, он более не используется

  • Cron оперирует скриптами, которые запускаются на принципах временного повторения (час, день, неделя, месяц)

[root@centos8 ~]# ls /etc/cron
cron.d/       cron.daily/   cron.deny     cron.hourly/  cron.monthly/ crontab       cron.weekly/
[root@centos8 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

Описание anacron

  • Anacron - сервис, который связан с cron, и отслеживающий задачи, для которых не указано специфичное время

    • Anacron обрабатывает задачи в /etc/cron.{hourly,daily,weekly,monthly}

  • Настройки хранятся в /etc/anacrontab

[root@centos8 ~]# cat /etc/anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1	5	cron.daily		nice run-parts /etc/cron.daily
7	25	cron.weekly		nice run-parts /etc/cron.weekly
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly

Планирование с cron

  • Выбрать опцию для создания планировщика

    • Запустить через crontab -e

    • Создать cron файл в /etc/cron.d

  • Настроить необходимое время:

    • */ 10 4 11 12 1-5

      • минута (*/10)

      • час (4)

      • день месяца (11)

      • месяц (12)

      • день недели (1-5)

  • Cron не имеет STDOUT, любая такая команда приведет к ошибке

  • Документация по cron доступна в man 5 crontab

Systemd таймеры

  • Таймеры также выполняют задачи, которые может планировать cron

    • Получает все большее распространение, но cron все еще является стандартом

  • Документация доступна в:

    • man 7 systemd-timer для общей информации

    • man 7 systemd-time для спецификации форматов времени

[root@centos8 ~]# ls  /usr/lib/systemd/system | grep timer
chrony-dnssrv@.timer
dnf-makecache.timer
fstrim.timer
mdadm-last-resort@.timer
mdcheck_continue.timer
mdcheck_start.timer
mdmonitor-oneshot.timer
mlocate-updatedb.timer
systemd-tmpfiles-clean.timer
timers.target
timers.target.wants
unbound-anchor.timer
  • Таймер сопровождается сервисом, который определяет как и что запускать

[root@centos8 ~]# cat /usr/lib/systemd/system/fstrim.timer 
[Unit]
Description=Discard unused blocks once a week
Documentation=man:fstrim

[Timer]
OnCalendar=weekly
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target
[root@centos8 ~]# cat /usr/lib/systemd/system/fstrim.service 
[Unit]
Description=Discard unused blocks

[Service]
Type=oneshot
ExecStart=/usr/sbin/fstrim -av
  • Запускать при необходимости нужно таймер, который уже будет ждать, когда нужно запустить сервис

[root@centos8 ~]# systemctl status fstrim.service
● fstrim.service - Discard unused blocks
   Loaded: loaded (/usr/lib/systemd/system/fstrim.service; static; vendor preset: disabled)
   Active: inactive (dead)
[root@centos8 ~]# systemctl enable fstrim.timer
Created symlink /etc/systemd/system/timers.target.wants/fstrim.timer → /usr/lib/systemd/system/fstrim.timer.
[root@centos8 ~]# systemctl start fstrim.timer
[root@centos8 ~]# systemctl status fstrim.timer
● fstrim.timer - Discard unused blocks once a week
   Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: disabled)
   Active: active (waiting) since Mon 2020-03-02 21:50:52 MSK; 6s ago
  Trigger: Mon 2020-03-09 00:00:00 MSK; 6 days left
     Docs: man:fstrim

Mar 02 21:50:52 centos8 systemd[1]: Started Discard unused blocks once a week.

Использование at

  • Для использования at необходим запущенный сервис atd

  • at <time> планирует задачу

    • Здесь же задаются параметры задачи в интерактивной оболочке

    • Ctrl+D закрывает оболочку

  • atq покажет список запланированных задач

  • atrm снимет задачи со списка

[root@centos8 ~]# systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-02-14 20:35:45 MSK; 2 weeks 3 days ago
 Main PID: 1191 (atd)
    Tasks: 1
   Memory: 508.0K
   CGroup: /system.slice/atd.service
           └─1191 /usr/sbin/atd -f

Feb 14 20:35:45 centos8 systemd[1]: Started Job spooling tools.
[root@centos8 ~]# at 22:00
warning: commands will be executed using /bin/sh
at> logger hello
at> <EOT>
job 1 at Mon Mar  2 22:00:00 2020

Управление временными файлами

  • Для управления временными файлами используетс служба systemd-tmpfiles

  • Директория /usr/lib/tmpfiles.d управляет настройками для создания, удаления и очистки временных файлов

  • Таймер systemd-tmpfiles-clean.timer может быть использован для автоматической очистки временных файлов

    • Он запускает systemd-tmpfiles-clean.service

    • Этот сервис в свою очередь запускает systemd-tmpfiles --clean

  • Файл /usr/lib/tmpfiles.d/tmp.conf содержит настройки для автоматической очистки

  • При изменении настроек необходимо скопировать файл в /etc/tmpfiles.d

    • После исполнить systemd-tmpfiles --clean etc/tmpfiles.d/tmp.conf для проверки на ошибки

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

  • man tmpfiles.d содержит необходимую документацию

  • Важно не только правильно написать конфигурацию, но учитывать временные параметры в таймере systemd

[root@centos8 ~]# cat /usr/lib/tmpfiles.d/tmp.conf 
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# See tmpfiles.d(5) for details

# Clear tmp directories separately, to make them easier to override
q /tmp 1777 root root 10d
q /var/tmp 1777 root root 30d

# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp

# Remove top-level private temporary directories on each boot
R! /tmp/systemd-private-*
R! /var/tmp/systemd-private-*

Last updated