Как мне перечислить все задания cron для всех пользователей? - PullRequest
791 голосов
/ 25 сентября 2008

Существует ли команда или существующий сценарий, который позволяет мне просматривать все запланированные задания cron * системы NIX одновременно? Я бы хотел, чтобы он включал все пользовательские crontabs, а также /etc/crontab и все, что есть в /etc/cron.d. Также было бы неплохо увидеть конкретные команды, запускаемые run-parts в /etc/crontab.

В идеале, я хотел бы, чтобы выходные данные были в приятной форме столбца и упорядочены каким-либо осмысленным образом.

Затем я мог бы объединить эти списки с нескольких серверов, чтобы просмотреть общее «расписание событий».

Я собирался написать такой сценарий сам, но если кто-то уже пошел на неприятности ...

Ответы [ 23 ]

7 голосов
/ 12 июля 2012
for user in $(cut -f1 -d: /etc/passwd); 
do 
    echo $user; crontab -u $user -l; 
done
6 голосов
/ 28 декабря 2017

Получить список от пользователя ROOT.

for user in $(cut -f1 -d: /etc/passwd); do echo $user; sudo crontab -u $user -l; done
5 голосов
/ 20 декабря 2016

Следующее убирает комментарии, пустые строки и ошибки от пользователей без crontab. Все, что вам осталось, это четкий список пользователей и их рабочих мест.

Обратите внимание на использование sudo во 2-й строке. Если вы уже root, удалите его.

for USER in $(cut -f1 -d: /etc/passwd); do \
USERTAB="$(sudo crontab -u "$USER" -l 2>&1)";  \
FILTERED="$(echo "$USERTAB"| grep -vE '^#|^$|no crontab for|cannot use this program')";  \
if ! test -z "$FILTERED"; then  \
echo "# ------ $(tput bold)$USER$(tput sgr0) ------";  \
echo "$FILTERED";  \
echo "";  \
fi;  \
done

Пример вывода:

# ------ root ------
0 */6 * * * /usr/local/bin/disk-space-notify.sh
45 3 * * * /opt/mysql-backups/mysql-backups.sh
5 7 * * * /usr/local/bin/certbot-auto renew --quiet --no-self-upgrade

# ------ sammy ------
55 * * * * wget -O - -q -t 1 https://www.example.com/cron.php > /dev/null

Я использую это в Ubuntu (12-16) и Red Hat (5-7)

4 голосов
/ 25 сентября 2008

Зависит от вашей версии cron. Используя Vixie cron во FreeBSD, я могу сделать что-то вроде этого:

(cd /var/cron/tabs && grep -vH ^# *) 

, если я хочу, чтобы табуляция была уменьшена, я мог бы сделать что-то вроде этого:

(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/      /")

Где это буквальная вкладка в части замены sed.

Может быть более системно независимым проходить через пользователей в /etc/passwd и делать crontab -l -u $user для каждого из них.

3 голосов
/ 07 августа 2009

Спасибо за этот очень полезный скрипт. У меня были небольшие проблемы с запуском его на старых системах (Red Hat Enterprise 3, которые по-разному обрабатывают egrep и табуляции в строках), а также на других системах, где ничего не было в /etc/cron.d/ (тогда скрипт заканчивался ошибкой). Итак, вот патч, чтобы он работал в таких случаях:

2a3,4
> #See:  /108860/kak-mne-perechislit-vse-zadaniya-cron-dlya-vseh-polzovatelei
>
27c29,30
<         match=$(echo "${line}" | egrep -o 'run-parts (-{1,2}\S+ )*\S+')
---
>         #match=$(echo "${line}" | egrep -o 'run-parts (-{1,2}\S+ )*\S+')
>         match=$(echo "${line}" | egrep -o 'run-parts.*')
51c54,57
< cat "${CRONDIR}"/* | clean_cron_lines >>"${temp}"  # */ <not a comment>
---
> sys_cron_num=$(ls /etc/cron.d | wc -l | awk '{print $1}')
> if [ "$sys_cron_num" != 0 ]; then
>       cat "${CRONDIR}"/* | clean_cron_lines >>"${temp}"  # */ <not a comment>
> fi
67c73
<     sed "1i\mi\th\td\tm\tw\tuser\tcommand" |
---
>     sed "1i\mi${tab}h${tab}d${tab}m${tab}w${tab}user${tab}command" |

Я не совсем уверен, что изменения в первом egrep - это хорошая идея, но этот скрипт без проблем протестирован на RHEL3,4,5 и Debian5. Надеюсь, это поможет!

2 голосов
/ 08 сентября 2016

вы можете написать для всего списка пользователей:

sudo crontab -u userName -l

,

Вы также можете перейти на

cd /etc/cron.daily/
ls -l
cat filename

этот файл будет перечислять расписания

cd /etc/cron.d/
ls -l
cat filename
2 голосов
/ 19 мая 2016

Я думаю, что лучший вкладыш был бы ниже. Например, если у вас есть пользователи в NIS или LDAP, они не будут в / etc / passwd. Это даст вам crontabs каждого пользователя, который вошел в систему.

for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done
2 голосов
/ 22 декабря 2018

С извинениями и благодаря yukondude.

Я попытался обобщить настройки времени для легкого чтения, хотя это не идеальная работа, и я не касаюсь «каждую пятницу» или «только по понедельникам».

Это версия 10 - это сейчас:

  • работает намного быстрее
  • имеет дополнительные символы прогресса, чтобы вы могли улучшить скорость дальше.
  • использует разделительную линию для разделения заголовка и вывода.
  • выводит в компактном формате, когда все временные интервалы без учета могут быть суммированы.
  • Принимает январь ... декабрьские дескрипторы месяцев года
  • Принимает пн ... дескрипторы Солнца для дней недели
  • пытается обработать дублирование анакрона в стиле Debian, когда он отсутствует
  • пытается обработать строки crontab, которые запускают файл после предварительного тестирования исполняемости, используя "[-x ...]"
  • пытается обработать строки crontab, которые запускают файл после предварительного тестирования исполняемости с помощью команды -v
  • позволяет использовать интервалы и списки.
  • поддерживает использование частей выполнения в пользовательских файлах / var / spool crontab.

Сейчас я публикую сценарий полностью здесь.

https://gist.github.com/myshkin-uk/d667116d3e2d689f23f18f6cd3c71107

2 голосов
/ 26 марта 2014

Здание на вершине @Kyle

for user in $(tail -n +11 /etc/passwd | cut -f1 -d:); do echo $user; crontab -u $user -l; done

чтобы избежать комментариев обычно вверху / etc / passwd,

и на macosx

for user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done    
1 голос
/ 10 января 2018

В Solaris для определенного известного имени пользователя:

crontab -l username

Все остальные * Nix потребуется -u модификатор:

crontab -u username -l

Чтобы получить все рабочие места пользователя одновременно в Solaris, как и в других постах выше:

for user in $(cut -f1 -d: /etc/passwd); do crontab -l $user 2>/dev/null; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...