Analizuj i optymalizuj crontabs [zamknięte]

9

Czy istnieje narzędzie do tworzenia wykresów, analizy i pomocy w optymalizacji wykonywania pliku crontab?

Aby to wyjaśnić, myślę o narzędziu, które generuje wykres, kiedy zadania cron są wykonywane, i pomagają sysadminowi w ich inteligentnej reorganizacji.

Inkaphink
źródło
1
Nic nie mogę wymyślić, ale to jutro w święto państwowe, więc mogę spróbować napisać taki.
Tom O'Connor,

Odpowiedzi:

4

Jedyne, co zrobiłem, to przeniesienie zadań CRON do ustrukturyzowanego harmonogramu zadań w celu wykreślenia zależności i uzyskania wglądu w okna przestojów efektów.

ewwhite
źródło
Wygląda to interesująco, ale jest dość trudne do wdrożenia.
inkaphink
To było dla crontaba na 1200 linii, którego używałem ... ale tak, bardzo ciężki. Chciałbym też zobaczyć coś lżejszego.
ewwhite
2

Jakiś szkielet, który przypisuje unikalny identyfikator każdemu zadaniu cron i koreluje go w pliku (plikach) dziennika i / lub loguje się do określonej lokalizacji w celu zapisania informacji o środowisku wykonawczym (w przeciwieństwie do normalnego dziennika wyjściowego). Nie będzie to trywialne, jakkolwiek go zaprojektujesz, ale w małych systemach łatwo jest to sprawdzić, patrząc na swoje pliki crontab i pliki dziennika.

Zakładam jednak, że nie mówisz o małych systemach.

adapttr
źródło
Podoba mi się ten pomysł i można go stosunkowo łatwo wdrożyć w samym cronie, a nie w otoku / frameworku. Po prostu md5sumuj linię crontab dla unikalnego identyfikatora i śledź SIGCHILD, aby rejestrować czasy zatrzymania.
Mark Wagner,
0

Skrypt do drukowania wszystkich zadań systemowych posortowanych według czasu

#!/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
źródło