Analyser et optimiser les crontabs [fermé]

9

Existe-t-il un outil pour représenter graphiquement, analyser et aider à optimiser l'exécution de crontab?

Pour clarifier, je pense à un outil qui générerait un graphique de l'exécution des tâches cron et aiderait l'administrateur système à les réorganiser intelligemment.

ℝaphink
la source
1
Je ne peux pas penser à quoi que ce soit du haut de ma tête, mais c'est lundi férié demain, donc je pourrais essayer d'en écrire un.
Tom O'Connor

Réponses:

4

La seule chose que j'ai faite est de déplacer les tâches cron dans un planificateur de tâches structuré afin de représenter graphiquement les dépendances et de gagner en visibilité dans les fenêtres d'indisponibilité des effets.

ewwhite
la source
Cela semble intéressant mais assez lourd à mettre en œuvre.
ℝaphink
C'était pour un crontab de 1200 lignes que j'utilisais ... mais oui, très lourd. J'aimerais aussi voir quelque chose de plus léger.
ewwhite
2

Une sorte de cadre pour attribuer un ID unique à chaque tâche cron et corréler celui-ci dans le (s) fichier (s) journal et / ou se connecter à un emplacement spécifique pour enregistrer les informations d'exécution (par opposition au journal de sortie normal). Cela ne va pas être trivial quelle que soit la conception, mais pour les petits systèmes, il est facile de voir cela en regardant vos crontabs et vos fichiers journaux.

Je suppose que vous ne parlez pas de petits systèmes, cependant.

adaptr
la source
J'aime cette idée et elle pourrait être implémentée relativement facilement dans cron lui-même plutôt que dans un wrapper / framework. Juste md5sum la ligne crontab pour l'identifiant unique et suivre SIGCHILD pour enregistrer les heures d'arrêt.
Mark Wagner
0

Un script pour imprimer toutes les tâches système triées par heure

#!/bin/bash

CRONTAB='/etc/crontab'
CRONDIR='/etc/cron.d'

tab=$(echo -en "\t")

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;
}

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;
}


temp=$(mktemp) || exit 1


cat "${CRONTAB}" | clean_cron_lines | lookup_run_parts >"${temp}" 


cat "${CRONDIR}"/* | clean_cron_lines >>"${temp}"  # */ <not a comment>

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)

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 --key=1 |
    sed "1i\mi\th\td\tm\tw\tuser\tcommand" |
    column -s"${tab}" -t

rm --force "${temp}"
stefcud
la source