Вопрос или проблема
В большинстве дистрибутивов GNU/Linux по умолчанию все события, связанные с запуском (и многими другими событиями) каждой задачи cron, записываются в syslog. Это довольно удобно, но не для очень частых задач, которые запускаются, скажем, каждую минуту.
Я знаю, как перенаправить все события задач cron в другой лог через /etc/rsyslog.conf
(*.*;cron,auth,authpriv.none -/var/log/syslog
), и легко можно сильно ограничить логирование, скажем, только событиями ошибок через /etc/default/cron
(EXTRA_OPTS="-L 4"
). Но это повлияет на все задачи cron.
Что если я хочу ограничить логирование определенных задач cron (например, частых задач, которые выполняются каждую минуту)? Можно ли это настроить через /etc/rsyslog.conf
или в /etc/crontab
? Система – Debian 8.0 Jessie.
С ИМХО это невозможно через конфигурационные файлы, потому что это, как вы сказать, повлияет на все задачи cron для пользователя.
Тем не менее, можно принудительно перенаправить только стандартный вывод или как стандартный вывод, так и стандартный поток ошибок конкретных задач cron таким образом:
* * * * * cron_cmdline_job1 >> /<path>/cron_job1.stdout.log
* * * * * cron_cmdline_job2 >>& /<path>/cron_job2.stdout_stderr.log
Преимущество перенаправления только стандартного вывода заключается в том, что вы сразу получите email с содержимым стандартного потока ошибок, когда задача завершится (если это ваше предпочтение, это также можно считать недостатком).
Если такие логи не представляют интереса, вы можете направить их в /dev/null, конечно.
Вы можете иметь одну длительную задачу cron
, которая выполняет задачи каждую минуту? Что-то вроде:
#!/bin/bash
flagfile="/var/run/longrunner.pid"
rm -f "$flagfile" 2>/dev/null
printf "$PID\n" >"$flagfile"
while [[ -e "$flagfile ]] ; do
shortjob &
sleep 60s
done
Я помещаю shortjob
в фоновый режим, чтобы он не искажает 60-секундный сон. Поскольку sleep
не ограничен целыми числами, вы можете настроить задержку.
Вы можете остановить выполнение “каждой минуты” с помощью kill -9 $(cat /var/run/longrunner.pid)
ИЛИ rm /var/run/longrunner.pid
.
Ответ или решение
Пропуск логирования некоторых задач cron в syslog/rsyslog
В большинстве дистрибутивов GNU/Linux, включая Debian 8.0 Jessie, по умолчанию все события задач cron логируются в syslog. Это удобно, но может привести к избыточным записям в случае часто выполняемых задач, например, запускаемых каждую минуту. Если вы хотите ограничить логирование только для определенных задач, например, частых, есть несколько подходов, которые можно рассмотреть.
Изменение конфигурации rsyslog
Система rsyslog не предоставляет возможности настроить выборочное логирование для конкретных задач cron. Настройка, которую вы можете изменить в файле /etc/rsyslog.conf
, будет действовать на все задачи cron, поэтому этот путь не приведет к желаемому результату. Также изменение переменной EXTRA_OPTS
в /etc/default/cron
для ограничения уровня логирования также повлияет на все задачи cron.
Перенаправление вывода конкретных задач
Хотя нет возможности настроить выборочное логирование в конфигурации rsyslog, вы можете перенаправить стандартный вывод и стандартный поток ошибок конкретных задач cron. Например:
* * * * * cron_cmdline_job1 >> /path/cron_job1.stdout.log
* * * * * cron_cmdline_job2 >>/path/cron_job2.stdout_stderr.log 2>&1
В этом случае, вывод (stdout
) и ошибки (stderr
) будут записываться в указанные вами файлы. Если задачу не нужно логировать вовсе, можно направлять вывод в /dev/null
:
* * * * * cron_cmdline_job1 >> /dev/null 2>&1
Таким образом, вы получите возможность контролировать логирование на уровне отдельных задач.
Комплексный подход с длительной задачей cron
Альтернативным решением может стать создание одной длительной задачи, которая будет управлять выполнением всех необходимых "быстрых" задач. Пример такого сценария на Bash:
#!/bin/bash
flagfile="/var/run/longrunner.pid"
rm -f "$flagfile" 2>/dev/null
printf "$$" > "$flagfile"
while [[ -e "$flagfile" ]] ; do
shortjob &
sleep 60
done
В этом примере мы создаем флаг-файл, который будет поддерживать работу вашего скрипта. Это позволяет запускать shortjob
каждые 60 секунд. Для остановки выполнения задачи можно использовать команду:
kill -9 $(cat /var/run/longrunner.pid)
или удалить флаг-файл:
rm /var/run/longrunner.pid
Заключение
Хотя на уровне системы rsyslog нет возможности выборочного логирования для отдельных задач cron, вы можете использовать методы перенаправления вывода или объединить частые задачи в одну длительную задачу. Такой подход поможет снизить количество записей в логе и упростить управление задачами. Поскольку системный администратор, вы сможете настраивать логи в зависимости от специфики выполнения ваших задач, оставаясь при этом в рамках общих системных настроек.