Как получить список всех задач cron у всех пользователей в Linux ?

Вроде простая задача и вроде есть простое решение в виде:

for user in $(cut -d':' -f1 /etc/passwd); do crontab -u $user -l; done

Но решение неудобное и нужно всегда держать его в голове.
Давайте его усовершенствуем.

Исходные данные: Debian 8.9 (jessie)

Небольшой экскурс для тех кто не в курсе как вообще посмотреть список запланированных задач в планировщике cron в Linux:

Список задач у текущего пользователя:

crontab -l

Список задач у пользователя vasua:

crontab -u vasua -l

Для вывод задач для всех пользователей очевидно нужно взять список пользователей в системе из /etc/passwd и сделать для каждого пользователя crontab -u USERNAME -l, то есть:

for user in $(cut -d':' -f1 /etc/passwd); do crontab -u $user -l; done

Недостаток этого решения очевиден:
1. Нужно всегда помнить эту команду.
2. Если у пользователя нет задач в планировщике то мы получим сообщение «no crontab for vasua» и таких сообщений может быть десятки если у вас много пользователей — это неудобно.
3. Вывод информации неудобно читать.

Но это не финишная прямая, а только начало, ведь опытный системный администратор знает, что кроме вывода списка заданий командой crontab -l -u USER есть еще задания планировщика в каталоге /etc/cron.d/ и это тоже нужно учитывать, потому что например панель хостинга ISPConfig сохраняет задания cron в каталоге /etc/cron.d/ с именами ispc_webXXX, где webXXX — это логин системного пользователя, например web30 и вывод crontab -l -u web30 нам скажет «no crontab for web30», а на самом деле в файле /etc/cron.d/ispc_web30 может быть такая картина:

SHELL='/bin/sh'

*/2     *       *       *       *       web30   /usr/bin/php -f /var/www/mysite.ru/web/yii cron-origin/index

Задачи в /etc/cron.d мы тоже учтем и покажем в решении ниже.

Итак, создадим функцию allcrontab в файле ~/.bashrc для ввода информации в более удобном виде:

# Определим цвета вывода
red='\e[0;31m'
RED='\e[1;31m'
green='\e[0;32m'
GREEN='\e[1;32m'
NC='\e[0m'

# Определим нашу функцию вывода списка всех задач cron у всех пользователей
function allcrontab() {
    for user in $(cut -d':' -f1 /etc/passwd); do
        usercrontab=$(crontab -l -u ${user} 2>/dev/null)
        if [ -n "${usercrontab}" ]; then
            echo -e "${RED}====== Start crontab for user ${NC}${GREEN}${user}${NC} ${RED}======${NC}"
            crontab -l -u ${user} | sed '/ *#/d; /^ *$/d'
            echo -e "${RED}====== End crontab for user ${NC}${GREEN}${user}${NC} ${RED}========${NC}\n"
        fi
    done
    for crond in $(ls -L1 /etc/cron.d); do
        crondtab=$(cat "/etc/cron.d/${crond}" 2>/dev/null | egrep -Ev "^\s*(;|#|$)")
        if [ -n "${crondtab}" ]; then
            echo -e "${RED}====== Start cron.d ${NC}${GREEN}/etc/cron.d/${crond}${NC} ${RED}======${NC}"
            echo "${crondtab}"
            echo -e "${RED}====== End cron.d ${NC}${GREEN}/etc/cron.d${crond}${NC} ${RED}======${NC}\n"
        fi
    done
}

Выполняем source ~/.bashrc или перелогиниваемся и выполняем в консоле allcrontab и видим красивый вывод списка всех задач cron у всех пользователей и дополнительно вывод задач из /etc/cron.d:

Результат выполнения allcrontab

Результат выполнения allcrontab

Так же опытный системный администратор знает, что существует anacron (anachronistic cron или асинхронный (анахроничный) cron) и его запуск и его задания тоже нужно учитывать, см. файл /etc/cron.d/anacron и /etc/anacrontab и каталоги /etc/cron.daily/, /etc/cron.hourly/, /etc/cron.monthly/ и /etc/cron.weekly/, но обсуждение anacron уже выходит за рамки этой статьи.

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


Подписаться
Уведомить о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

5 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Сергей
Сергей
3 лет назад

Спасибо за рабочий скрипт!!!

Дмитрий
Дмитрий
3 лет назад

Спасибо!

Антон
Антон
3 лет назад

«создадим функцию allcrontab в файле ~/.bashrc для ввода информации в более удобном виде»

Подскажите, где располагается файл «~/.bashrc»? И что значит знак тильда и слэш перед точкой?

Я нашел следующие файлы: «bash.bashrc», расположенный в директории «etc»; и файлы «.bashrc», расположенные в директории «root» и в одноименной директории мною созданного пользователя, что расположена в директории «home».

P.S. Извините, только начинаю во всем этом разбираться. Спасибо.

Владислав
Владислав
3 месяцев назад

Спасибо.
Стоит добавить в скрипт обработку файла /etc/crontab

5
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x