كيف أقوم بإدراج جميع وظائف cron لجميع المستخدمين؟

سئل على ٢٥ سبتمبر ٢٠٠٨  ·  تمت مشاهدة 872.1k مرة  ·  مصدر

yukondude picture
في ٢٥ سبتمبر ٢٠٠٨

هل هناك أمر أو نص موجود سيسمح لي بمشاهدة جميع وظائف cron المجدولة لنظام * NIX مرة واحدة؟ أرغب في تضمين جميع crontabs المستخدم ، بالإضافة إلى /etc/crontab وأي شيء موجود في /etc/cron.d . سيكون من الجيد أيضًا رؤية الأوامر المحددة يتم تشغيلها بواسطة run-parts في /etc/crontab .

من الناحية المثالية ، أود أن يكون الإخراج في شكل عمود لطيف ومرتّب بطريقة مفيدة.

يمكنني بعد ذلك دمج هذه القوائم من خوادم متعددة لعرض "الجدول الزمني للأحداث" بشكل عام.

كنت على وشك كتابة مثل هذا السيناريو بنفسي ، ولكن إذا واجه شخص ما مشكلة بالفعل ...

الإجابات

Kyle Burton picture
في ٢٥ سبتمبر ٢٠٠٨
1159

سيكون عليك تشغيل هذا كجذر ، ولكن:

for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done

سوف تدور حول كل اسم مستخدم يسرد crontab الخاص به. تعود ملكية crontabs للمستخدمين المعنيين ، لذا لن تتمكن من رؤية crontab لمستخدم آخر بدون كونهم هم أو الجذر.


تحرير إذا كنت تريد معرفة المستخدم الذي ينتمي إليه crontab ، استخدم echo $user

for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
yukondude picture
في ٢٦ سبتمبر ٢٠٠٨
315

انتهى بي الأمر بكتابة نص (أحاول أن أعلم نفسي النقاط الدقيقة في البرمجة النصية للباش ، ولهذا السبب لا ترى شيئًا مثل بيرل هنا). إنها ليست مسألة بسيطة تمامًا ، لكنها تفعل معظم ما أحتاجه. يستخدم اقتراح Kyle للبحث عن crontabs للمستخدمين الفرديين ، ولكنه يتعامل أيضًا مع /etc/crontab (بما في ذلك البرامج النصية التي تم إطلاقها بواسطة run-parts في /etc/cron.hourly ، /etc/cron.daily ، إلخ. .) والمهام الموجودة في الدليل /etc/cron.d . يأخذ كل هؤلاء ويدمجهم في عرض شيء مثل ما يلي:

mi     h    d  m  w  user      command
09,39  *    *  *  *  root      [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm
47     */8  *  *  *  root      rsync -axE --delete --ignore-errors / /mirror/ >/dev/null
17     1    *  *  *  root      /etc/cron.daily/apt
17     1    *  *  *  root      /etc/cron.daily/aptitude
17     1    *  *  *  root      /etc/cron.daily/find
17     1    *  *  *  root      /etc/cron.daily/logrotate
17     1    *  *  *  root      /etc/cron.daily/man-db
17     1    *  *  *  root      /etc/cron.daily/ntp
17     1    *  *  *  root      /etc/cron.daily/standard
17     1    *  *  *  root      /etc/cron.daily/sysklogd
27     2    *  *  7  root      /etc/cron.weekly/man-db
27     2    *  *  7  root      /etc/cron.weekly/sysklogd
13     3    *  *  *  archiver  /usr/local/bin/offsite-backup 2>&1
32     3    1  *  *  root      /etc/cron.monthly/standard
36     4    *  *  *  yukon     /home/yukon/bin/do-daily-stuff
5      5    *  *  *  archiver  /usr/local/bin/update-logs >/dev/null

لاحظ أنه يعرض المستخدم ، وفرزًا أكثر أو أقل بالساعة والدقيقة حتى أتمكن من رؤية الجدول اليومي.

حتى الآن ، اختبرتها على Ubuntu و Debian و Red Hat AS.

#!/bin/bash

# System-wide crontab file and cron job directory. Change these for your system.
CRONTAB='/etc/crontab'
CRONDIR='/etc/cron.d'

# Single tab character. Annoyingly necessary.
tab=$(echo -en "\t")

# Given a stream of crontab lines, exclude non-cron job lines, replace
# whitespace characters with a single space, and remove any spaces from the
# beginning of each line.
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;
}

# Given a stream of cleaned crontab lines, echo any that don't include the
# run-parts command, and for those that do, show each job file in the run-parts
# directory as if it were scheduled explicitly.
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;
}

# Temporary file for crontab lines.
temp=$(mktemp) || exit 1

# Add all of the jobs from the system-wide crontab file.
cat "${CRONTAB}" | clean_cron_lines | lookup_run_parts >"${temp}" 

# Add all of the jobs from the system-wide cron directory.
cat "${CRONDIR}"/* | clean_cron_lines >>"${temp}"  # */ <not a comment>

# Add each user's crontab (if it exists). Insert the user's name between the
# five time fields and the command.
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)

# Output the collected crontab lines. Replace the single spaces between the
# fields with tab characters, sort the lines by hour and minute, insert the
# header line, and format the results as a table.
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,1 |
    sed "1i\mi\th\td\tm\tw\tuser\tcommand" |
    column -s"${tab}" -t

rm --force "${temp}"
Matt picture
في ١٢ ديسمبر ٢٠٠٨
199

ضمن Ubuntu أو Debian ، يمكنك عرض crontab بواسطة /var/spool/cron/crontabs/ وبعد ذلك يوجد ملف لكل مستخدم هناك. هذا فقط من أجل crontab الخاص بالمستخدم بالطبع.

بالنسبة إلى Redhat 6/7 و Centos ، يكون سعر crontab أقل من /var/spool/cron/ .

idranoels picture
في ٧ أغسطس ٢٠١٥
35

سيعرض هذا جميع إدخالات crontab من جميع المستخدمين.

sed 's/^\([^:]*\):.*$/crontab -u \1 -l 2>\&1/' /etc/passwd | grep -v "no crontab for" | sh
J&#248;rgen picture
في ٣ أغسطس ٢٠١٣
30

يعتمد على إصدار لينكس الخاص بك ولكني أستخدم:

tail -n 1000 /var/spool/cron/*

كجذر. بسيط جدا وقصير جدا.

يعطيني إخراج مثل:

==> /var/spool/cron/root <==
15 2 * * * /bla

==> /var/spool/cron/my_user <==
*/10 1 * * * /path/to/script
sum picture
في ٦ يوليو ٢٠١٠
15

تنقيح بسيط لإجابة كايل بيرتون مع تنسيق الإخراج المحسن:

#!/bin/bash
for user in $(cut -f1 -d: /etc/passwd)
do echo $user && crontab -u $user -l
echo " "
done
Mithaldu picture
في ١٩ مايو ٢٠١٠
14
getent passwd | cut -d: -f1 | perl -e'while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print "$_\n$l\n" if $l}'

هذا يتجنب العبث بـ passwd مباشرة ، ويتخطى المستخدمين الذين ليس لديهم إدخالات cron وبالنسبة لأولئك الذين لديهم ، فإنه يطبع اسم المستخدم وكذلك crontab الخاص بهم.

غالبًا ما يتم إسقاط هذا هنا حتى أتمكن من العثور عليه لاحقًا في حال احتجت إلى البحث عنه مرة أخرى.

Sheikh Abdul Wahid picture
في ٢٨ ديسمبر ٢٠١٧
12

للحصول على قائمة من مستخدم ROOT.

for user in $(cut -f1 -d: /etc/passwd); do echo $user; sudo crontab -u $user -l; done
Doris picture
في ٢٣ أغسطس ٢٠١١
11

إذا قمت بفحص مجموعة باستخدام NIS ، فإن الطريقة الوحيدة لمعرفة ما إذا كان لدى المستخدم إدخال crontab وفقًا لإجابات Matt / var / spool / cron / tabs.

grep -v "#" -R  /var/spool/cron/tabs
Sam T picture
في ٢٣ يونيو ٢٠١٧
10

هذا البرنامج النصي يعمل معي في CentOS لإدراج جميع crons في البيئة:

sudo cat /etc/passwd | sed 's/^\([^:]*\):.*$/sudo crontab -u \1 -l 2>\&1/' | grep -v "no crontab for" | sh