951 votes

Comment répertorier toutes les tâches cron pour tous les utilisateurs ?

Est-il une commande ou un script qui me permettra de vue tout d'un *NIX système de l'horaire de tâches cron à la fois? Je voudrais inclure la totalité de l'utilisateur crontabs, ainsi que /etc/crontab, et ce, en /etc/cron.d. Il serait également agréable de voir les commandes exécutées par run-parts en /etc/crontab.

Idéalement, j'aimerais que la sortie dans une belle forme de colonne et d'une commande de manière significative.

J'ai pu ensuite fusionner ces listes à partir de plusieurs serveurs pour afficher l'ensemble de la "calendrier des événements".

J'étais sur le point d'écrire un script moi-même, mais si quelqu'un est déjà allé à la peine...

1251voto

Kyle Burton Points 10471

Vous devez exécuter cette en tant que root, mais:

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

une boucle sur chaque nom d'utilisateur inscription de leurs crontab. Les crontabs sont la propriété de leurs auteurs respectifs, de sorte que vous ne serez pas en mesure de voir un autre crontab w/o étant eux ou de la racine.


modifier si vous voulez savoir, et dont l'utilisateur fait un crontab appartiennent à insérer echo $utilisateur

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

336voto

yukondude Points 8756

J'ai fini par écrire un script (je suis en train de m'enseigner les subtilités de l'écriture de scripts bash, c'est pourquoi vous ne verrez pas quelque chose comme Perl ici). Ce n'est pas une simple affaire, mais il n'est plus de ce dont j'ai besoin. Il utilise de Kyle suggestion de recherche individuels des utilisateurs crontabs, mais traite aussi de l' /etc/crontab (y compris les scripts lancés par run-parts en /etc/cron.hourly, /etc/cron.daily, etc.) et le emplois dans l' /etc/cron.d répertoire. Il faut de tout de ceux-ci et les fusionne en un afficher quelque chose comme ce qui suit:

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

Notez qu'il montre à l'utilisateur, et plus ou moins sortes par des heures et des minutes afin que je puisse voir l'horaire quotidien.

Jusqu'à présent, je l'ai testé sur Ubuntu, Debian et Red Hat.

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

18voto

sum Points 121

Un petit raffinement de Kyle Burton réponse avec l'amélioration de formatage de sortie:

#!/bin/bash
for user in $(cut -f1 -d: /etc/passwd)
do echo $user && crontab -u $user -l
echo " "
done

16voto

Mithaldu Points 1575
getent passwd | cut -d: -f1 | perl -e'while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print "$_\n$l\n" if $l}'

Cela évite de jouer avec passwd, ignore les utilisateurs qui n'ont pas de cron entrées et pour ceux qui les ont il imprime le nom d'utilisateur ainsi que leur crontab.

Pour la plupart abandonné ce ici, mais si je peux le trouver plus tard dans les cas que j'ai jamais besoin de la rechercher à nouveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X