Есть ли команда или существующий скрипт, который позволит мне просмотреть все запланированные задания cron в системе *NIX за один раз? Я бы хотел, чтобы она включала все пользовательские кронтабы, а также /etc/crontab
, и все, что находится в /etc/cron.d
. Также было бы неплохо видеть конкретные команды, выполняемые run-parts
в /etc/crontab
.
В идеале, я хотел бы получить результаты в виде столбцов и упорядоченные каким-либо значимым образом.
Затем я мог бы объединить эти списки с нескольких серверов для просмотра общего "расписания событий"
Я собирался написать такой скрипт сам, но если кто-то уже пошел на это...
Вам придется запустить это от имени root, но:
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
переберет все имена пользователей и выведет список их кронтабов. Кронтабы принадлежат соответствующим пользователям, поэтому вы не сможете увидеть кронтаб другого пользователя, не будучи им или root'ом.
Редактировать
если вы хотите узнать, какому пользователю принадлежит кронтаб, используйте echo $user
.
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
В итоге я написал скрипт (я пытаюсь освоить тонкости написания сценариев на bash, поэтому здесь вы не увидите что-то вроде Perl). Это не совсем простой скрипт, но он делает большую часть того, что мне нужно. Он использует предложение Кайла для поиска кронтабов отдельных пользователей, но также имеет дело с /etc/crontab
(включая скрипты, запускаемые run-parts
в /etc/cron.hourly
, /etc/cron.daily
и т.д.) и заданиями в каталоге /etc/cron.d
. Он берет все эти данные и объединяет их в следующее отображение:
mi h d m w user command
09,39 * * * * root [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm
47 */8 * * * root rsync -axE --delete --ignore-errors / /mirror/ >/dev/null
17 1 * * * root /etc/cron.daily/apt
17 1 * * * root /etc/cron.daily/aptitude
17 1 * * * root /etc/cron.daily/find
17 1 * * * root /etc/cron.daily/logrotate
17 1 * * * root /etc/cron.daily/man-db
17 1 * * * root /etc/cron.daily/ntp
17 1 * * * root /etc/cron.daily/standard
17 1 * * * root /etc/cron.daily/sysklogd
27 2 * * 7 root /etc/cron.weekly/man-db
27 2 * * 7 root /etc/cron.weekly/sysklogd
13 3 * * * archiver /usr/local/bin/offsite-backup 2>&1
32 3 1 * * root /etc/cron.monthly/standard
36 4 * * * yukon /home/yukon/bin/do-daily-stuff
5 5 * * * archiver /usr/local/bin/update-logs >/dev/null
Обратите внимание, что он показывает пользователя и сортирует по часам и минутам, чтобы я мог видеть ежедневное расписание.
На данный момент я протестировал его на Ubuntu, Debian и Red Hat AS.
#!/bin/bash
# System-wide crontab file and cron job directory. Change these for your system.
CRONTAB='/etc/crontab'
CRONDIR='/etc/cron.d'
# Single tab character. Annoyingly necessary.
tab=$(echo -en "\t")
# Given a stream of crontab lines, exclude non-cron job lines, replace
# whitespace characters with a single space, and remove any spaces from the
# beginning of each line.
function clean_cron_lines() {
while read line ; do
echo "${line}" |
egrep --invert-match '^($|\s*#|\s*[[:alnum:]_]+=)' |
sed --regexp-extended "s/\s+/ /g" |
sed --regexp-extended "s/^ //"
done;
}
# Given a stream of cleaned crontab lines, echo any that don't include the
# run-parts command, and for those that do, show each job file in the run-parts
# directory as if it were scheduled explicitly.
function lookup_run_parts() {
while read line ; do
match=$(echo "${line}" | egrep -o 'run-parts (-{1,2}\S+ )*\S+')
if [[ -z "${match}" ]] ; then
echo "${line}"
else
cron_fields=$(echo "${line}" | cut -f1-6 -d' ')
cron_job_dir=$(echo "${match}" | awk '{print $NF}')
if [[ -d "${cron_job_dir}" ]] ; then
for cron_job_file in "${cron_job_dir}"/* ; do # */ <not a comment>
[[ -f "${cron_job_file}" ]] && echo "${cron_fields} ${cron_job_file}"
done
fi
fi
done;
}
# Temporary file for crontab lines.
temp=$(mktemp) || exit 1
# Add all of the jobs from the system-wide crontab file.
cat "${CRONTAB}" | clean_cron_lines | lookup_run_parts >"${temp}"
# Add all of the jobs from the system-wide cron directory.
cat "${CRONDIR}"/* | clean_cron_lines >>"${temp}" # */ <not a comment>
# Add each user's crontab (if it exists). Insert the user's name between the
# five time fields and the command.
while read user ; do
crontab -l -u "${user}" 2>/dev/null |
clean_cron_lines |
sed --regexp-extended "s/^((\S+ +){5})(.+)$/\1${user} \3/" >>"${temp}"
done < <(cut --fields=1 --delimiter=: /etc/passwd)
# Output the collected crontab lines. Replace the single spaces between the
# fields with tab characters, sort the lines by hour and minute, insert the
# header line, and format the results as a table.
cat "${temp}" |
sed --regexp-extended "s/^(\S+) +(\S+) +(\S+) +(\S+) +(\S+) +(\S+) +(.*)$/\1\t\2\t\3\t\4\t\5\t\6\t\7/" |
sort --numeric-sort --field-separator="${tab}" --key=2,1 |
sed "1i\mi\th\td\tm\tw\tuser\tcommand" |
column -s"${tab}" -t
rm --force "${temp}"
Под Ubuntu или Debian, вы можете посмотреть кронтаб к в/var/катушка/крон/crontabs/
и выберите файл для каждого пользователя там. Что's только для конкретного пользователя кронтаб's, конечно.
Для RedHat 6/7 и CentOS crontab-файл находится в в/var/катушка/хрон/
.
Это покажет все записи кронтаб всех пользователей.
sed 's/^\([^:]*\):.*$/crontab -u \1 -l 2>\&1/' /etc/passwd | grep -v "no crontab for" | sh
Зависит от вашей версии Linux, но я использую:
tail -n 1000 /var/spool/cron/*
как корень. Очень простой и очень короткий.
Дает мне выходной, как:
==> /var/spool/cron/root <==
15 2 * * * /bla
==> /var/spool/cron/my_user <==
*/10 1 * * * /path/to/script
getent passwd | cut -d: -f1 | perl -e'while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print "$_\n$l\n" if $l}'
Это позволяет избежать баловаться командой passwd напрямую, пропускает пользователям, которые не имеют записей cron и для тех, кто их выводит имя пользователя, а также их кронтаб.
Главным образом, хотя падение это здесь, так что я могу найти его позже в случае, если я когда-нибудь понадобится, чтобы снова искать его.
Мне нравится простой одну строчку выше ответ:
для пользователей в $(распил -Ф1 -Д: в /etc/passwd С); сделать кронтаб -у пользователя $user -л; сделать
Но Солярис не имею -у флага и не печатает пользователей это's проверка, Вы можете изменить его следующим образом:
for user in $(cut -f1 -d: /etc/passwd); do echo User:$user; crontab -l $user 2>&1 | grep -v crontab; done
Вы получите список пользователей без ошибки, кронтаб, Если аккаунт не разрешается использовать cron и т. д. Следует помнить, что в Солярисе, роли могут быть в /etc/passwd и тоже (смотрите /etc/user_attr).
Чтобы получить список от пользователя root.
for user in $(cut -f1 -d: /etc/passwd); do echo $user; sudo crontab -u $user -l; done
for user in $(cut -f1 -d: /etc/passwd);
do
echo $user; crontab -u $user -l;
done
Следующие убирает комментарии, пустые строки, и ошибок от пользователей без кронтаб. Все, что вы'вновь остается-это четкий список пользователей и их рабочих мест.
Обратите внимание на использование судо
в 2-й линии. Если вы're уже 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) и Красная Шапочка (от 5 до 7).
Зависит от вашей версии 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, которые обрабатывают по-разному egrep и табуляции в строках), и других систем С ничего в /etc/cron-а.Д/ С (тогда скрипт завершился с ошибкой). Так вот патч, чтобы заставить его работать в таких случаях :
2a3,4
> #See: http://stackoverflow.com/questions/134906/how-do-i-list-all-cron-jobs-for-all-users
>
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 без каких либо проблем. Надеюсь, что это помогает!
С извинениями и благодаря yukondude.
Я'вэ пытался суммировать сроки настройки для легкого чтения, хотя это's не идеальная работа, и я Дон't нажмите 'каждую пятницу' или 'только по понедельникам' вещи.
Это версия 10 - это сейчас:
Я сейчас публикации сценария в полном объеме.
https://gist.github.com/myshkin-uk/d667116d3e2d689f23f18f6cd3c71107
Здание на @Кайл
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
Я думаю, что лучше один лайнер будет ниже. Например, если у вас есть пользователи в NIS или LDAP они wouldnt быть в /etc/passwd и. Это даст вам кронтабе каждого пользователя, который вошел в систему.
for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done
вы можете написать для всех список пользователей :
sudo crontab -u userName -l
,
Вы также можете перейти к
cd /etc/cron.daily/
ls -l
cat filename
этот файл будет содержать список графиков
cd /etc/cron.d/
ls -l
cat filename
Поскольку это вызывает зацикливание через файл (файл/etc/passwd С
) и выполняет действие, мне не хватает правильного подхода как я могу прочитать файл (поток данных, переменная) построчно (и/или поля)?:
while IFS=":" read -r user _
do
echo "crontab for user ${user}:"
crontab -u "$user" -l
done < /etc/passwd
Это читает из/etc/passwd с помощью строки с помощью :
как разделитель полей. Что читать -R пользователь , мы
$user, то удерживать первое поле и
` остальные (это просто старье переменной игнорировать поля).
Таким образом, то мы можем назвать кронтаб -у
с помощью$пользователей переменной`, которую мы процитировать для безопасности (а если он содержит пробелы? Вряд ли в такой файл, но вы можете не знать).