Анализировать и оптимизировать crontabs [закрыто]


9

Есть ли инструмент для построения графиков, анализа и оптимизации работы crontab?

Чтобы уточнить, я имею в виду инструмент, который генерировал бы график, когда выполняются задания cron, и помогал бы системному администратору разумно их реорганизовать.


1
Я не могу думать ни о чем из головы, но завтра банковский выходной, поэтому я мог бы написать один.
Том О'Коннор

Ответы:


4

Единственное, что я сделал, - переместил задания cron в структурированный планировщик заданий , чтобы отобразить зависимости и получить представление о окнах простоя эффектов.


Это выглядит интересно, но довольно тяжело для реализации.
ℝaphink

Это был кронтаб на 1200 строк, который я использовал ... но да, очень тяжелый. Я бы тоже хотел увидеть что-нибудь более легкое.
ewwhite

2

Какая-то платформа для присвоения уникального идентификатора каждому заданию cron и сопоставления его в файлах журнала и / или регистрации в определенном месте для записи информации времени выполнения (в отличие от обычного выходного журнала). Это не будет тривиальным, как бы вы его ни проектировали, но для небольших систем легко увидеть это, посмотрев на свои crontabs и файлы журналов.

Я предполагаю, что вы не говорите о небольших системах, хотя.


Мне нравится эта идея, и она может быть относительно легко реализована в самом cron, а не в оболочке / фреймворке. Просто md5sum в строке crontab для уникального идентификатора и отследите SIGCHILD, чтобы записать время остановки.
Марк Вагнер


0

Скрипт для печати всех системных задач, отсортированных по времени

#!/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}"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.