Comment lister toutes les tâches cron pour tous les utilisateurs ?

Existe-t-il une commande ou un script existant qui me permette de visualiser en une seule fois toutes les tâches cron programmées sur un système *NIX ? J'aimerais que cela inclue tous les crontabs des utilisateurs, ainsi que /etc/crontab, et tout ce qui se trouve dans /etc/cron.d. Il serait également intéressant de voir les commandes spécifiques exécutées par run-parts dans /etc/crontab.

Idéalement, j'aimerais que la sortie se présente sous la forme d&#8217une belle colonne et qu&#8217elle soit ordonnée de manière significative.

Je pourrais alors fusionner ces listes provenant de plusieurs serveurs pour voir l'ensemble du "programme des événements.&quot ;

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

Vous devrez l'exécuter en tant que root, mais.. :

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

bouclera sur chaque nom d'utilisateur en listant leur crontab. Les crontabs appartiennent aux utilisateurs respectifs, vous ne pourrez donc pas voir le crontab d'un autre utilisateur sans être lui ou root.


Edit Si vous voulez savoir à quel utilisateur appartient un crontab, utilisez echo $user.

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

J&#8217ai fini par écrire un script (j&#8217essaie de m&#8217apprendre les subtilités du scriptage bash, c&#8217est pourquoi vous ne verrez pas quelque chose comme Perl ici). Ce n'est pas exactement une affaire simple, mais il fait la plupart de ce dont j'ai besoin. Elle utilise la suggestion de Kyle pour rechercher les crontabs des utilisateurs individuels, mais s'occupe aussi de /etc/crontab (y compris les scripts lancés par run-parts dans /etc/cron.hourly, /etc/cron.daily, etc.) et des tâches dans le répertoire /etc/cron.d. Il prend tous ces éléments et les fusionne dans un affichage qui ressemble à 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 qu'il trie plus ou moins par heure et par minute pour que je puisse voir le programme quotidien.

Jusqu'à présent, je l'ai testé sur Ubuntu, Debian et 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  # */ 
                    [[ -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}"  # */ 

# 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 < 
Commentaires (17)

Cela dépend de votre version de cron. En utilisant Vixie cron sur FreeBSD, je peux faire quelque chose comme ceci :

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

si je veux plus de tabulations, je peux faire quelque chose comme ceci :

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

Où c'est une tabulation littérale dans la partie de remplacement de sed.

Il peut être plus indépendant du système de boucler sur les utilisateurs dans /etc/passwd et de faire crontab -l -u $user pour chacun d'eux.

Commentaires (0)