Lister Toutes les Crontabs

Publié: 27 novembre 2013 dans Debian, Industrialisation, Informatique, Linux, script, Ubuntu
#!/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. 
[[ -f ${CRONTAB} ]] && cat "${CRONTAB}" | clean_cron_lines | lookup_run_parts >"${temp}"  
# Add all of the jobs from the system-wide cron directory. 
[[ -f ${CRONTAB} ]] && cat "${CRONTAB}" | clean_cron_lines | lookup_run_parts >"${temp}"  
# Add all of the jobs from the system-wide cron directory. 
[[ -d ${CRONDIR} ]] && ( cat "${CRONDIR}"/* 2> /dev/null | clean_cron_lines >>"${temp}" ||  true ) # */ <not a com
ment>
# 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}"
Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s