Tüm kullanıcılar için tüm cron işlerini nasıl listeleyebilirim?


857

Bir * NIX sisteminin planlanan cron işlerinin tümünü aynı anda görmeme izin verecek bir komut veya mevcut bir komut dosyası var mı? Ben de sıra, kullanıcı crontabs tüm dahil etmek istediğiniz /etc/crontabve ne olursa olsun öyle /etc/cron.d. Ayrıca run-partsiçinde çalıştırılan belirli komutları görmek de güzel olurdu /etc/crontab.

İdeal olarak, çıktıyı güzel bir sütun biçiminde istiyorum ve anlamlı bir şekilde sipariş verdim.

Daha sonra, genel "etkinlik programını" görüntülemek için bu girişleri birden çok sunucudan birleştirebilirim.

Kendimi böyle bir senaryo yazmak üzereydim, ama eğer biri zaten belaya girerse ...


2
Unix SE hakkında benzer soru: unix.stackexchange.com/questions/7053/…
maxschlepzig

Yanıtlar:


1134

Bunu root olarak çalıştırmanız gerekir, ancak:

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

crontab'ını listeleyen her kullanıcı adı üzerinde döngü kurar. Crontabs ilgili kullanıcılara aittir, böylece başka bir kullanıcının crontab'ı kendileri veya kökü olmadan göremezsiniz.


Düzen bir crontab, kullanımına ait olduğu kullanıcı bilmek istiyorsanızecho $user

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

53
Kullanıcılar NIS veya LDAP'de tanımlandığında çalışmaz. Kullanmanız gerekiyorfor user in $(getent passwd | cut -f1 -d: ); do echo $user; crontab -u $user -l; done
Hubert Kario

9
Yorumları hariç tutmak ve 'kullanıcı için crontab yok ...' iletilerini bastırmak için bunu güncelledik:for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l 2>/dev/null | grep -v '^#'; done
Jonathan

38
/ Var / spool / cron'daki dosyalara bakmak daha kolay olmaz mıydı?
graywh

2
Biz LDAP ve / etc / passwd yerine getent komutu verilmelidir:for user in $(getent passwd | awk -F : '{print $1}'); do echo $user; crontab -u $user -l; done
Toby Batch

9
Ne cronjobs hakkında /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/...?
Abdull

309

Bir senaryo yazdım (kendime bash senaryosunun daha ince noktalarını öğretmeye çalışıyorum, bu yüzden burada Perl gibi bir şey görmüyorsunuz). Tam olarak basit bir mesele değil, ama ihtiyacım olan şeylerin çoğunu yapıyor. Bireysel kullanıcıların crontab dosyalarına bakmak için Kyle'ın öneri kullanır, ancak aynı zamanda bunların /etc/crontab(başlattığı komut dosyalarını içeren run-partsyılında /etc/cron.hourly, /etc/cron.dailyve işler, vs.) /etc/cron.ddizinine. Bunların hepsini alır ve aşağıdakine benzer bir şekilde birleştirir:

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

Günlük programı görebilmem için kullanıcıyı ve daha fazla veya daha az saat ve dakikaya göre gösterildiğini unutmayın.

Şimdiye kadar Ubuntu, Debian ve Red Hat AS'de test ettim.

#!/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}"

38
Hiçbir şey, ama / etc / crontab ve /etc/cron.d/ sistem cron işleri hakkında hiçbir şey yapmadı. Bunlarla uğraşmak ve sonunda her şeyi biçimlendirmek senaryomun yaptığı şey.
yukondude

10
yukondude - bunu bir gist olarak bile github'a koymayı düşünmelisiniz.
Kyle Burton

3
Yapıştırmayı kopyalayıp çalıştırmayı denedim, ancak başarısız oldu: showcrons.sh: satır 59: beklenmeyen simge yakınında sözdizimi hatası <' showcrons.sh: line 59: yapıldı <<(cut --fields = 1 --delimiter =: / etc / passwd) '
Fraggle

2
@KyleBurton Bunu kopyalayan en az 8 gist var gibi görünüyor, gist.github.com/gists/…
Zitrax

9
Uyarı: Bu script eksik/etc/anacrontab
ck_

191

Ubuntu veya debian altında, tarafından crontab'ı görüntüleyebilir /var/spool/cron/crontabs/ve her kullanıcı için bir dosya oradadır. Bu sadece kullanıcıya özgü crontab'lar için elbette.

Redhat 6/7 ve Centos için crontab altında /var/spool/cron/.


7
Bu, RedHat üzerinde de çalışır (/ var / spool / cron) ve özellikle hesapları yönetmek için Ldap gibi bir şey kullanıyorsanız, bir komut dosyası yazmaktan / çalıştırmaktan daha kolaydır. +1
user49913

6
Bu benim için diğer cevaplardan daha yararlı oldu. Bu yöntem, artık var olmayan kullanıcıların crontabs'larını görüntülemenizi sağlar ve OP tarafından talep edilen TÜM cron işlerini verir.
Andrew Ensley

1
Bu yöntemin bir başka avantajı: sunucum LDAP kullanıyor, bu yüzden kullanıcıların çoğu yok /etc/passwd. IMO bu tüm kaba kuvvet çözümlerinden ziyade kabul edilen cevap olmalıdır.
Mikkel

1
Burada Suse Linux ile iyi.
Bret

Teşekkürler, bu AWS EC2 instace için de geçerlidir, bu bilgi çok yardımcı oldu!
Ivan Marjanovic

34

Bu, tüm kullanıcıların tüm crontab girdilerini gösterecektir.

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

30

Linux sürümünüze bağlıdır, ancak şunu kullanıyorum:

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

kök olarak. Çok basit ve çok kısa.

Bana şöyle çıktı verir:

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

==> /var/spool/cron/my_user <==
*/10 1 * * * /path/to/script

4
tail -n +1 /var/spool/cron/*Dosyaların tüm içeriğini listelemek için kullanın .
Hans Ginzel

4
... ya sudo sh -c 'tail -n +1 /var/spool/cron/*'da kök olmak istemiyorsanız. OKB beni bu komutu neden yazılı olarak sudo edemediğimi araştırmaya zorladı. Bunun nedeni, normal kullanıcıların / var / spool / cron dir dosyasına erişememesidir ve glob, açıkça var olmayan bir gerçek yıldız karakteri olarak yorumlanıyordu.
Dale Anderson

alternatif olarak, cd /var/spool/cron/cron/ && grep . *her cron işi önünde ilgili kullanıcı adını da yazdıracaktır
Jakub Kukul


14
getent passwd | cut -d: -f1 | perl -e'while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print "$_\n$l\n" if $l}'

Bu, doğrudan passwd ile uğraşmayı önler, cron girişi olmayan kullanıcıları atlar ve bunlara sahip olanlar için kullanıcı adını ve crontab'ını yazdırır.

Çoğunlukla bu olsa da bırakarak ben hiç tekrar aramak gerekirse durumda daha sonra bulabiliriz.


1
Ayrıca içinde bulunmayan LDAP kullanıcılarını da listeler /etc/passwd. Matt'in yukarıdaki çözümü bu özel duruma daha uygundur, ancak komutun var olduğunu bilmek iyidir.
Mikkel

11

Kümeyi NIS kullanarak kontrol ederseniz, kullanıcının crontab girişine sahip olup olmadığını görmenin tek yolu Matt'in answer / var / spool / cron / tabs komutuna göre ist.

grep -v "#" -R  /var/spool/cron/tabs

11

ROOT kullanıcıdan liste almak için.

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

10

Bu senaryo CentOS'ta benim için çalıştı ve ortamdaki tüm cronsları listeledi:

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

2
Müthiş! Cron işinin hangi kullanıcının altında olduğunu görmek için küçük bir varyasyon ekledim ve sonuçlar arasında biraz boşluk bıraktım: cat /etc/passwd | sed 's/^\([^:]*\):.*$/echo "\ncrontab for \1:"; sudo crontab -u \1 -l 2>\&1/' | grep -v "no crontab for" | shbiraz zaman kazandırıyor
jamil

9

Yukarıdaki basit tek satırlık cevabı beğendim:

kullanıcı için $ (cut -f1 -d: / etc / passwd); crontab -u $ kullanıcı -l; tamam

Ancak -u bayrağı olmayan ve denetlediği kullanıcıyı yazdırmayan Solaris, şu şekilde değiştirebilirsiniz:

for user in $(cut -f1 -d: /etc/passwd); do echo User:$user; crontab -l $user 2>&1 | grep -v crontab; done

Bir hesabın cron vb. Kullanmasına izin verilmediğinde crontab tarafından atılan hatalar olmadan bir kullanıcı listesi alırsınız. Solaris'te rollerin / etc / passwd içinde de olabileceğini unutmayın (bkz. / Etc / user_attr).



Güzel. TIL kullanmamak için.
squarism


7

Aşağıdakiler, crontab'ı olmayan kullanıcıların yorumlarını, boş satırlarını ve hatalarını ortadan kaldırır. Geriye kalan tek şey, kullanıcıların ve işlerinin net bir listesidir.

sudo2. satırdaki kullanımına dikkat edin. Zaten root iseniz, kaldırın.

for USER in $(cut -f1 -d: /etc/passwd); do \
USERTAB="$(sudo crontab -u "$USER" -l 2>&1)";  \
FILTERED="$(echo "$USERTAB"| grep -vE '^#|^$|no crontab for|cannot use this program')";  \
if ! test -z "$FILTERED"; then  \
echo "# ------ $(tput bold)$USER$(tput sgr0) ------";  \
echo "$FILTERED";  \
echo "";  \
fi;  \
done

Örnek çıktı:

# ------ root ------
0 */6 * * * /usr/local/bin/disk-space-notify.sh
45 3 * * * /opt/mysql-backups/mysql-backups.sh
5 7 * * * /usr/local/bin/certbot-auto renew --quiet --no-self-upgrade

# ------ sammy ------
55 * * * * wget -O - -q -t 1 https://www.example.com/cron.php > /dev/null

Bunu Ubuntu (12'den 16'ya) ve Red Hat'da (5'ten 7'ye) kullanıyorum.


5

Cron sürümünüze bağlıdır. FreeBSD üzerinde Vixie cron kullanarak, böyle bir şey yapabilirsiniz:

(cd /var/cron/tabs && grep -vH ^# *) 

daha sekme sınırlandırılmış istiyorsanız, ben böyle bir şey yapabilir:

(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/      /")

Burada sed değiştirme kısmında gerçek bir sekme.

Kullanıcılar arasında dolaşmak /etc/passwdve crontab -l -u $userher biri için bunu yapmak sistemden bağımsız olabilir .


4

Bu çok yararlı komut dosyası için teşekkürler. Ben eski sistemlerde (dizeleri farklı egrep ve sekmeler ele Red Hat Enterprise 3) ve /etc/cron.d/ (komut dosyası daha sonra bir hata ile sona erdi) hiçbir şey ile diğer sistemleri üzerinde çalışan bazı küçük sorunlar vardı. İşte bu gibi durumlarda çalışması için bir yama:

2a3,4
> #See:  http://stackoverflow.com/questions/134906/how-do-i-list-all-cron-jobs-for-all-users
>
27c29,30
<         match=$(echo "${line}" | egrep -o 'run-parts (-{1,2}\S+ )*\S+')
---
>         #match=$(echo "${line}" | egrep -o 'run-parts (-{1,2}\S+ )*\S+')
>         match=$(echo "${line}" | egrep -o 'run-parts.*')
51c54,57
< cat "${CRONDIR}"/* | clean_cron_lines >>"${temp}"  # */ <not a comment>
---
> sys_cron_num=$(ls /etc/cron.d | wc -l | awk '{print $1}')
> if [ "$sys_cron_num" != 0 ]; then
>       cat "${CRONDIR}"/* | clean_cron_lines >>"${temp}"  # */ <not a comment>
> fi
67c73
<     sed "1i\mi\th\td\tm\tw\tuser\tcommand" |
---
>     sed "1i\mi${tab}h${tab}d${tab}m${tab}w${tab}user${tab}command" |

İlk egrep'teki değişikliklerin iyi bir fikir olduğundan emin değilim, ama bu komut dosyası RHEL3,4,5 ve Debian5 üzerinde sorunsuz bir şekilde test edildi. Bu yardımcı olur umarım!


3

@Kyle'nin üzerine bina

for user in $(tail -n +11 /etc/passwd | cut -f1 -d:); do echo $user; crontab -u $user -l; done

/ etc / passwd dosyasının üst kısmındaki yorumlardan kaçınmak için,

Ve macosx'ta

for user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done    

3
grep -v '^#Sihirli sayıya güvenmek yerine yapmamalısın 11?
rr-

1
Red Hat / CentOS dağıtımları, kullanıcının crontabının başlangıcında faydalı ipuçları yazmaz, bu nedenle ilk 11 satırın kesilmesi, içeriğinin silinmesine neden olur. Bir Ubuntu kullanıcısı kendi crontab'ını düzenlediyse ve tüm el tutma işlemini kaldırırsa da aynı şey geçerli.
Dale Anderson


3

Daha iyi bir astarın aşağıda olacağını düşünüyorum. Örneğin, NIS veya LDAP'de kullanıcılarınız varsa, / etc / passwd içinde olmazlar. Bu size giriş yapmış her kullanıcının crontabs'ını verecektir.

for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done


3

tüm kullanıcı listesi için yazabilirsiniz:

sudo crontab -u userName -l

,

Ayrıca şu adrese gidebilirsiniz:

cd /etc/cron.daily/
ls -l
cat filename

bu dosya programları listeler

cd /etc/cron.d/
ls -l
cat filename

3

Özür dilerim ve yukondude sayesinde.

Mükemmel bir iş olmasa da kolay okuma için zamanlama ayarlarını özetlemeye çalıştım ve 'her Cuma' ya da 'sadece Pazartesi günleri' öğelerine dokunmuyorum.

Bu sürüm 10 - şimdi:

  • çok daha hızlı çalışır
  • hızı daha da artırabilmeniz için isteğe bağlı ilerleme karakterleri vardır.
  • başlığı ve çıktıyı ayırmak için bir ayırıcı çizgi kullanır.
  • karşılaşılan tüm zamanlama aralıkları özetlenebildiği zaman kompakt formatta çıktılar.
  • Ocak ayını kabul ediyor ... Yılın ayı için aralık tanımlayıcıları
  • Mon'i kabul eder ... Haftanın günleri için güneş tanımlayıcıları
  • eksik olduğunda anacronun debian tarzı dummying-up işlemek için çalışır
  • "[-x ...]" kullanarak çalıştırılabilirliği önceden test ettikten sonra bir dosyayı çalıştıran crontab satırlarıyla uğraşmaya çalışır
  • "command -v" kullanarak çalıştırılabilirliği önceden test ettikten sonra bir dosyayı çalıştıran crontab satırlarıyla uğraşmaya çalışır
  • aralık aralıklarının ve listelerin kullanımına izin verir.
  • kullanıcıya özgü / var / spool crontab dosyalarında çalışma parçası kullanımını destekler.

Şimdi senaryoyu burada tam olarak yayınlıyorum.

https://gist.github.com/myshkin-uk/d667116d3e2d689f23f18f6cd3c71107


2

Bu bir dosya ( /etc/passwd) üzerinden döngü ve bir eylem gerçekleştirme meselesi olduğundan, bir dosyayı (veri akışı, değişken) satır satır (ve / veya alan-tarla nasıl okuyabilirim) konusunda uygun yaklaşımı kaçırıyorum. )? :

while IFS=":" read -r user _
do
   echo "crontab for user ${user}:"
   crontab -u "$user" -l
done < /etc/passwd

Bu , alan sınırlayıcı olarak /etc/passwdsatır satır okur :. Söyleyerek read -r user _, $userilk alanı ve _geri kalanını tutuyoruz (alanları görmezden gelmek sadece önemsiz bir değişkendir).

Bu şekilde, güvenlik için teklif ettiğimiz crontab -udeğişkeni kullanarak çağırabiliriz $user(ya boşluk içeriyorsa? Böyle bir dosyada olması olası değildir, ancak asla bilemezsiniz).


1

Solaris'te, bilinen belirli bir kullanıcı adı için:

crontab -l username

Diğer tüm * Nix'in -udeğiştiriciye ihtiyacı olacak :

crontab -u username -l

Yukarıdaki diğer gönderiler gibi, kullanıcının tüm işlerini aynı anda Solaris'te almak için:

for user in $(cut -f1 -d: /etc/passwd); do crontab -l $user 2>/dev/null; done

-1

Benim için / var / spool / cron / crontabs'a bakmak en iyi yoldur


2
Bu daha önce cevaplandı
bummi

-2

Bu komut dosyası Crontab'ı bir dosyaya verir ve ayrıca crontab girişi olmayanları onaylayan tüm kullanıcıları listeler:

for user in $(cut -f1 -d: /etc/passwd); do 
  echo $user >> crontab.bak
  echo "" >> crontab.bak
  crontab -u $user -l >> crontab.bak 2>> > crontab.bak
done

//, RobFrost, burada yazıldığı gibi bu betiğin sürekli çalıştığından emin misiniz?
Nathan Basanese

Bkz. Neden "for" ile satır okumuyorsunuz ? Ayrıca, bunu göndermeden önce birçok kez cevaplandı.
fedorqui 'SO
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.