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

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

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

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

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

Ответы [ 23 ]

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

Вы должны запустить это как root, но:

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

будет зацикливаться на каждом имени пользователя, перечисляя его crontab. Crontabs принадлежат соответствующим пользователям, поэтому вы не сможете увидеть crontab другого пользователя без него или root.


Редактировать если вы хотите знать, какому пользователю принадлежит crontab, используйте echo $user

for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
300 голосов
/ 26 сентября 2008

Я закончил тем, что написал сценарий (я пытаюсь научить себя тонкостям сценариев bash, поэтому здесь вы не видите ничего подобного Perl). Это не совсем простое дело, но оно делает большую часть того, что мне нужно. Он использует предложение Кайла для поиска crontabs отдельных пользователей, но также имеет дело с /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}"
172 голосов
/ 12 декабря 2008

В Ubuntu или debian вы можете просмотреть crontab по /var/spool/cron/crontabs/, а затем файл для каждого пользователя. Конечно, это только для пользовательских crontab.

Для Redhat 6/7 и Centos crontab находится под /var/spool/cron/.

31 голосов
/ 07 августа 2015

Это покажет все записи crontab от всех пользователей.

sed 's/^\([^:]*\):.*$/crontab -u \1 -l 2>\&1/' /etc/passwd | grep -v "no crontab for" | sh
28 голосов
/ 03 августа 2013

Зависит от вашей версии Linux, но я использую:

tail -n 1000 /var/spool/cron/*

как root. Очень просто и очень коротко.

Дает мне вывод как:

==> /var/spool/cron/root <==
15 2 * * * /bla

==> /var/spool/cron/my_user <==
*/10 1 * * * /path/to/script
14 голосов
/ 06 июля 2010

Небольшое уточнение ответа Кайла Бертона с улучшенным форматированием вывода:

#!/bin/bash
for user in $(cut -f1 -d: /etc/passwd)
do echo $user && crontab -u $user -l
echo " "
done
13 голосов
/ 19 мая 2010
getent passwd | cut -d: -f1 | perl -e'while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print "$_\n$l\n" if $l}'

Это позволяет избежать путаницы с passwd напрямую, пропускает пользователей, у которых нет записей cron, а для тех, у кого они есть, выводит имя пользователя и их crontab.

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

10 голосов
/ 23 августа 2011

Если вы проверяете кластер с помощью NIS, единственный способ проверить, есть ли у пользователя запись в crontab, - это ответ Мэтта /var/spool/cron/tabs.

.
grep -v "#" -R  /var/spool/cron/tabs
9 голосов
/ 23 июня 2017

Этот скрипт работал для меня в CentOS, чтобы перечислить все кроны в среде:

sudo cat /etc/passwd | sed 's/^\([^:]*\):.*$/sudo crontab -u \1 -l 2>\&1/' | grep -v "no crontab for" | sh
8 голосов
/ 03 мая 2010

Мне нравится простой однострочный ответ выше:

для пользователя в $ (cut -f1 -d: / etc / passwd); do crontab -u $ user -l; сделано

Но в Solaris, который не имеет флага -u и не печатает проверяемого пользователя, вы можете изменить его следующим образом:

for user in $(cut -f1 -d: /etc/passwd); do echo User:$user; crontab -l $user 2>&1 | grep -v crontab; done

Вы получите список пользователей без ошибок, выданных crontab, когда учетной записи не разрешено использовать cron и т. Д. Имейте в виду, что в Solaris роли могут быть также в / etc / passwd (см. / Etc / user_attr).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...