998 Stimmen

Wie kann ich alle Cron-Jobs für alle Benutzer auflisten?

Gibt es einen Befehl oder ein vorhandenes Skript, mit dem ich alle geplanten Cron-Jobs eines *NIX-Systems auf einmal sehen kann? Ich möchte, dass es alle Benutzer-Crontabs einschließt, ebenso wie /etc/crontab und was auch immer in /etc/cron.d . Es wäre auch schön, wenn man die spezifischen Befehle sehen könnte, die von run-parts sur /etc/crontab .

Im Idealfall hätte ich die Ausgabe gerne in einer schönen Spaltenform und in einer sinnvollen Reihenfolge.

Ich könnte dann diese Auflistungen von mehreren Servern zusammenführen, um den gesamten "Veranstaltungskalender" zu sehen.

Ich wollte selbst ein solches Drehbuch schreiben, aber wenn sich schon jemand die Mühe gemacht hat...

1300voto

Kyle Burton Punkte 25900

Sie müssen dies als Root ausführen, aber:

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

durchläuft eine Schleife über jeden Benutzernamen und listet dessen Crontab auf. Die Crontabs gehören den jeweiligen Benutzern, so dass Sie die Crontab eines anderen Benutzers nicht sehen können, ohne dieser oder Root zu sein.


Modifier wenn Sie wissen wollen, welchem Benutzer eine crontab gehört, verwenden Sie echo $user

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

349voto

yukondude Punkte 23093

Am Ende habe ich ein Skript geschrieben (ich versuche, mir die Feinheiten der Bash-Skripterstellung beizubringen, deshalb sehen Sie hier nicht so etwas wie Perl). Es ist nicht gerade eine einfache Angelegenheit, aber es tut das meiste, was ich brauche. Es benutzt Kyles Vorschlag, um die Crontabs der einzelnen Benutzer abzufragen, aber es befasst sich auch mit /etc/crontab (einschließlich der Skripte, die von run-parts sur /etc/cron.hourly , /etc/cron.daily usw.) und die Arbeitsplätze in der /etc/cron.d Verzeichnis. Es nimmt alle diese Dateien und fügt sie zu einer Anzeige wie der folgenden zusammen:

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

Man beachte, dass der Benutzer angezeigt wird und mehr oder weniger nach Stunden und Minuten sortiert ist, so dass ich den Tagesplan sehen kann.

Bislang habe ich es auf Ubuntu, Debian und Red Hat AS getestet.

#!/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}"

245voto

Unter Ubuntu oder Debian können Sie crontab einsehen, indem Sie /var/spool/cron/crontabs/ und dann eine Datei für jeden Benutzer. Das gilt natürlich nur für benutzerspezifische Crontabs.

Bei Redhat 6/7 und Centos befindet sich die crontab unter /var/spool/cron/ .

49voto

idranoels Punkte 437

Dadurch werden alle crontab-Einträge aller Benutzer angezeigt.

sed 's/^\([^:]*\):.*$/crontab -u \1 -l 2>\&1/' /etc/passwd | sh | grep -v "no crontab for"

39voto

Jørgen Punkte 1897

Hängt von Ihrer Linux-Version ab, aber ich benutze:

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

als Wurzel. Sehr einfach und sehr kurz.

Ich erhalte Ausgaben wie:

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

==> /var/spool/cron/my_user <==
*/10 1 * * * /path/to/script

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X