Вроде простая задача и вроде есть простое решение в виде:
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:
Так же опытный системный администратор знает, что существует anacron (anachronistic cron или асинхронный (анахроничный) cron) и его запуск и его задания тоже нужно учитывать, см. файл /etc/cron.d/anacron и /etc/anacrontab и каталоги /etc/cron.daily/, /etc/cron.hourly/, /etc/cron.monthly/ и /etc/cron.weekly/, но обсуждение anacron уже выходит за рамки этой статьи.
На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, POstgreSQL) на протяжении последних 24 лет.
Спасибо за рабочий скрипт!!!
Спасибо!
«создадим функцию allcrontab в файле ~/.bashrc для ввода информации в более удобном виде»
Подскажите, где располагается файл «~/.bashrc»? И что значит знак тильда и слэш перед точкой?
Я нашел следующие файлы: «bash.bashrc», расположенный в директории «etc»; и файлы «.bashrc», расположенные в директории «root» и в одноименной директории мною созданного пользователя, что расположена в директории «home».
P.S. Извините, только начинаю во всем этом разбираться. Спасибо.
Добрый, вечер.
Тильда означает домашний каталог пользователя.
Для root это /root
Для других это /home/USERNAME
Спасибо.
Стоит добавить в скрипт обработку файла /etc/crontab