Analisar e otimizar crontabs [fechado]

9

Existe uma ferramenta para representar graficamente, analisar e ajudar a otimizar a execução do crontab?

Para esclarecer, estou pensando em uma ferramenta que geraria um gráfico de quando os trabalhos cron são executados e ajudaria o administrador de sistemas a reorganizá-los de maneira inteligente.

ℝaphink
fonte
1
Não consigo pensar em nada fora da minha cabeça, mas é segunda-feira feriado bancário amanhã, para que eu possa escrever uma.
Tom O'Connor

Respostas:

4

A única coisa que fiz foi mover tarefas cron para um agendador de tarefas estruturado para representar graficamente dependências e obter visibilidade das janelas de tempo de inatividade dos efeitos.

ewwhite
fonte
Parece interessante, mas bastante pesado de implementar.
ℝaphink
Era para um crontab de 1200 linhas que eu estava usando ... mas sim, muito pesado. Eu gostaria de ver algo mais leve também.
ewwhite
2

Algum tipo de estrutura para atribuir um ID exclusivo a cada tarefa cron e correlacioná-lo no (s) arquivo (s) de log e / ou log para um local específico para registrar informações de tempo de execução (em oposição ao log de saída normal). Não será trivial, no entanto, como você o projeta, mas para sistemas pequenos é fácil observar isso olhando seus crontabs e arquivos de log.

Suponho que você não esteja falando de pequenos sistemas.

adaptr
fonte
Eu gosto dessa idéia e ela pode ser implementada com relativa facilidade no cron em vez de em um wrapper / framework. Apenas md5sumente a linha crontab para o identificador exclusivo e acompanhe o SIGCHILD para registrar os horários de parada.
Mark Wagner
0

Um script para imprimir todas as tarefas do sistema classificadas por hora

#!/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
fonte