Question Comment puis-je lister tous les travaux cron pour tous les utilisateurs?


Existe-t-il une commande ou un script existant qui me permet d'afficher tous les travaux cron planifiés d'un * NIX à la fois? Je voudrais inclure tous les crontabs utilisateur, ainsi que /etc/crontabet tout ce qu'il y a dedans /etc/cron.d. Il serait également agréable de voir les commandes spécifiques exécutées par run-parts dans /etc/crontab.

Idéalement, j'aimerais que la sortie soit sous forme de colonne et ordonnée de manière significative.

Je pourrais alors fusionner ces listes de plusieurs serveurs pour voir le "calendrier des événements" global.

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


730
2017-09-25 18:01


origine


Réponses:


Vous devriez exécuter ceci en tant que root, mais:

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

boucle sur chaque nom d'utilisateur listant leur crontab. Les crontabs sont la propriété des utilisateurs respectifs, donc vous ne serez pas en mesure de voir le crontab d'un autre utilisateur sans être eux ou root.


modifier 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

976
2017-09-25 18:07



J'ai fini par écrire un script (j'essaie de m'instruire les points les plus fins du script bash, c'est pourquoi vous ne voyez 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. Il utilise la suggestion de Kyle pour rechercher les crontabs des utilisateurs individuels, mais traite également /etc/crontab (y compris les scripts lancés par run-parts dans /etc/cron.hourly, /etc/cron.daily, etc.) et les emplois dans /etc/cron.d annuaire. Il prend tous ceux-ci et les fusionne dans un affichage quelque chose comme ceci:

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 trie par heure et par minute afin que je puisse voir l'horaire 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  # */ <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}"

282
2017-09-26 00:50



Sous Ubuntu ou Debian, vous pouvez voir crontab par /var/spool/cron/crontabs/ puis un fichier pour chaque utilisateur est là. C'est seulement pour les crontab spécifiques à l'utilisateur bien sûr.


155
2017-12-12 03:56



Ceci montrera toutes les entrées de crontab de tous les utilisateurs.

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

28
2017-08-07 08:56



Cela dépend de votre version de Linux mais j'utilise:

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

en tant que root. Très simple et très court.

Donne moi une sortie comme:

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

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

25
2017-08-03 00:40



Un petit raffinement de la réponse de Kyle Burton avec un formatage de sortie amélioré:

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

14
2017-07-06 11:29



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 directement avec passwd, ignore les utilisateurs qui n'ont pas d'entrées cron et pour ceux qui les ont, il imprime le nom d'utilisateur ainsi que leur crontab.

La plupart du temps laisser tomber ici mais si je peux le trouver plus tard au cas où je devrais jamais le chercher à nouveau.


13
2018-05-19 00:54



Si vous vérifiez un cluster en utilisant NIS, la seule façon de voir si un utilisateur a une entrée crontab est d'après la réponse de Matt / var / spool / cron / tabs.

grep -v "#" -R  /var/spool/cron/tabs

10
2017-08-23 12:13



J'aime la simple réponse d'un interligne ci-dessus:

pour l'utilisateur dans $ (couper -f1 -d: / etc / passwd); faire crontab -u $ utilisateur -l; terminé

Mais Solaris qui n'a pas l'indicateur -u et n'imprime pas l'utilisateur qu'il vérifie, vous pouvez le modifier comme ceci:

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

Vous obtiendrez une liste d'utilisateurs sans les erreurs lancées par crontab lorsqu'un compte n'est pas autorisé à utiliser cron, etc. Soyez conscient que dans Solaris, les rôles peuvent être dans / etc / passwd aussi (voir / etc / user_attr).


8
2018-05-03 17:38



Ce script a fonctionné pour moi dans CentOS pour lister tous les crons dans l'environnement:

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

8
2018-06-23 06:37



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

7
2017-07-12 14:57