Phân tích và tối ưu hóa crontabs [đóng]


9

Có một công cụ để vẽ đồ thị, phân tích và giúp tối ưu hóa việc thực hiện crontab không?

Để làm rõ, tôi đang nghĩ về một công cụ sẽ tạo ra một biểu đồ khi các công việc định kỳ được thực thi và giúp sysadmin sắp xếp lại chúng một cách thông minh.


1
Tôi không thể nghĩ ra bất cứ điều gì ngoài đỉnh đầu của mình, nhưng đó là ngày lễ vào ngày mai, vì vậy tôi có thể viết một bài.
Tom O'Connor

Câu trả lời:


4

Điều duy nhất tôi đã làm là chuyển các công việc định kỳ thành một lịch trình công việc có cấu trúc để biểu đồ phụ thuộc và hiển thị các cửa sổ thời gian chết hiệu ứng.


Điều đó có vẻ thú vị nhưng khá nặng nề để thực hiện.
ℝaphink

Đó là cho một crontab 1200 dòng tôi đang sử dụng ... nhưng vâng, rất nặng. Tôi cũng muốn thấy một cái gì đó nhẹ hơn.
ewwhite

2

Một số loại khung để gán một ID duy nhất cho mỗi công việc định kỳ và tương quan với trong tệp nhật ký và / hoặc ghi nhật ký đến một vị trí cụ thể để ghi thông tin thời gian chạy (trái ngược với nhật ký đầu ra thông thường). Tuy nhiên, nó sẽ không tầm thường khi bạn thiết kế nó, nhưng đối với các hệ thống nhỏ, bạn có thể dễ dàng nhận ra điều này khi nhìn vào crontabs và các tệp nhật ký của bạn.

Tôi cho rằng bạn không nói về các hệ thống nhỏ, mặc dù.


Tôi thích ý tưởng này và nó có thể được thực hiện tương đối dễ dàng trong chính cron hơn là một trình bao bọc / khung. Chỉ cần md5sum dòng crontab cho mã định danh duy nhất và theo dõi SIGCHILD để ghi lại thời gian dừng.
Mark Wagner


0

Một tập lệnh để in tất cả các tác vụ hệ thống được sắp xếp theo thời gian

#!/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}"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.