Как получить список всех задач 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. Вывод информации неудобно читать.

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

# Определим цвета вывода
red='\e[0;31m'
RED='\e[1;31m'
green='\e[0;32m'
GREEN='\e[1;32m'
yellow='\e[0;33m'
YELLOW='\e[1;33m'
blue='\e[0;34m'
BLUE='\e[1;34m'
cyan='\e[0;36m'
CYAN='\e[1;36m'
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
}

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

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

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

Но это не финишная прямая, а только начало, ведь умный системный администратор знает, что кроме вывода списка заданий командой 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

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

На этом все, до скорых встреч.