Apakah ada perintah atau ada script yang akan membiarkan saya melihat semua *NIX system's dijadwalkan cron jobs sekaligus? I'a seperti itu untuk mencakup semua pengguna crontabs, serta /etc/crontab
, dan apa pun yang's di /etc/cron.d
. Hal ini juga akan menjadi bagus untuk melihat perintah tertentu yang dijalankan oleh run-parts
di /etc/crontab
.
Idealnya, saya'd suka output dalam bentuk kolom dan memerintahkan dalam beberapa cara yang berarti.
Saya kemudian bisa menggabungkan ini daftar dari beberapa server untuk melihat keseluruhan "jadwal acara."
Aku hendak menulis naskah sendiri, tetapi jika seseorang's telah pergi ke kesulitan...
Anda akan memiliki untuk menjalankan ini sebagai root, tapi:
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
akan loop melalui setiap nama pengguna daftar mereka crontab. Yang crontabs dimiliki oleh masing-masing pengguna sehingga anda tidak't dapat melihat pengguna lain's crontab w/o menjadi mereka atau akar.
Edit
jika anda ingin tahu mana pengguna crontab milik, gunakan echo $user
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
Saya akhirnya menulis sebuah script (saya'm mencoba untuk mengajar diri sendiri poin-poin penting dari bash scripting, sehingga's mengapa anda don't melihat sesuatu seperti Perl di sini). It's bukanlah urusan sederhana, tapi itu tidak apa yang saya butuhkan. Menggunakan Kyle's saran untuk mencari pengguna individu' crontabs, tetapi juga berkaitan dengan /etc/crontab
(termasuk script yang diluncurkan oleh run-parts
di /etc/cron.jam
, /etc/cron.sehari-hari
, dll.) dan lowongan di /etc/cron.d
direktori. Ini mengambil semua dari mereka dan menggabungkan mereka ke dalam sebuah tampilan seperti berikut:
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
Catatan itu menunjukkan pengguna, dan lebih-atau-kurang macam dengan jam dan menit sehingga aku dapat melihat jadwal harian.
Sejauh ini, saya've diuji pada Ubuntu, Debian, dan Red Hat SEBAGAI.
#!/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}"
Di bawah Ubuntu atau debian, anda dapat melihat crontab dengan /var/spool/cron/crontabs/
dan kemudian file untuk masing-masing user yang ada di sana. Yang's hanya untuk pengguna tertentu crontab's saja.
Untuk Redhat 6/7 dan Centos, crontab adalah di bawah /var/spool/cron/
.
Tergantung pada versi linux tapi saya gunakan:
tail -n 1000 /var/spool/cron/*
sebagai root. Sangat sederhana dan sangat singkat.
Memberi saya output seperti:
==> /var/spool/cron/root <==
15 2 * * * /bla
==> /var/spool/cron/my_user <==
*/10 1 * * * /path/to/script
getent passwd | cut -d: -f1 | perl -e'while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print "$_\n$l\n" if $l}'
Hal ini untuk menghindari bermain-main dengan passwd langsung, melompat pengguna yang tidak memiliki entri cron dan bagi mereka yang memiliki mereka itu mencetak username serta mereka crontab.
Sebagian besar jatuh di sini meskipun begitu aku dapat menemukannya nanti kalau aku perlu mencari lagi.
Saya suka sederhana satu-liner jawaban di atas:
untuk pengguna di $(cut-f1 -d: /etc/passwd); melakukan crontab -u $user -l; dilakukan
Tapi Solaris yang tidak memiliki flag-u dan tidak mencetak pengguna it's memeriksa, anda dapat memodifikasinya seperti:
for user in $(cut -f1 -d: /etc/passwd); do echo User:$user; crontab -l $user 2>&1 | grep -v crontab; done
Anda akan mendapatkan daftar pengguna tanpa kesalahan dilemparkan oleh crontab ketika account tidak diperbolehkan untuk menggunakan cron dll. Diketahui bahwa di Solaris, peran dapat di /etc/passwd juga (lihat /etc/user_attr).
Berikut strip berbagai komentar, baris kosong, dan kesalahan dari pengguna yang tidak crontab. Semua anda're tersisa adalah daftar yang jelas dari pengguna dan pekerjaan mereka.
Perhatikan penggunaan sudo
di baris 2. Jika anda're sudah root, hapus itu.
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
Contoh output:
# ------ 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
Saya menggunakan ini pada Ubuntu (12 thru 16) dan Red Hat (5 melalui 7).
Tergantung pada versi dari cron. Menggunakan Vixie cron pada FreeBSD, aku bisa melakukan sesuatu seperti ini:
(cd /var/cron/tabs && grep -vH ^# *)
jika aku ingin lebih tab deliminated, aku bisa melakukan sesuatu seperti ini:
(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/ /")
Mana yang's literal tab di sed penggantian bagian.
Mungkin lebih sistem independen untuk loop melalui pengguna di /etc/passwd
dan melakukan crontab -l-u $user
untuk masing-masing dari mereka.
Terima kasih untuk ini script yang sangat berguna. Aku punya beberapa masalah kecil yang berjalan pada sistem lama (Red Hat Enterprise 3, yang menangani secara berbeda egrep dan tab dalam string), dan sistem-sistem yang lain dengan apa-apa di /etc/cron.d/ (script kemudian berakhir dengan kesalahan). Jadi di sini adalah sebuah patch untuk membuatnya bekerja dalam kasus-kasus seperti :
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" |
I'm tidak benar-benar yakin perubahan pertama egrep adalah ide yang baik, tapi yah, script ini telah diuji pada RHEL3,4,5 dan Debian5 tanpa masalah. Harap ini membantu!
Dengan permintaan maaf dan terima kasih untuk yukondude.
I've mencoba untuk meringkas waktu pengaturan untuk membaca mudah, meskipun itu's bukan pekerjaan yang sempurna, dan aku don't touch 'setiap jumat' atau 'hanya pada hari senin' hal.
Ini adalah versi 10 - sekarang:
Sekarang saya menerbitkan naskah secara lengkap di sini.
https://gist.github.com/myshkin-uk/d667116d3e2d689f23f18f6cd3c71107
Bangunan di atas @Kyle
for user in $(tail -n +11 /etc/passwd | cut -f1 -d:); do echo $user; crontab -u $user -l; done
untuk menghindari komentar-komentar yang biasanya di bagian atas dari /etc/passwd,
Dan di macosx
for user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done
Saya pikir lebih baik satu kapal akan berada di bawah. Misalnya jika anda memiliki pengguna di NIS atau LDAP mereka tidak akan berada di /etc/passwd. Ini akan memberi anda crontabs dari setiap user yang telah login.
for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done
anda dapat menulis untuk semua pengguna daftar :
sudo crontab -u userName -l
,
Anda juga dapat pergi ke
cd /etc/cron.daily/
ls -l
cat filename
file ini akan menampilkan daftar jadwal
cd /etc/cron.d/
ls -l
cat filename
Karena ini adalah masalah perulangan melalui file (/etc/passwd
) dan melakukan tindakan, saya hilang pendekatan yang tepat pada Bagaimana saya bisa membaca file (aliran data, variabel) line-by-line (dan/atau bidang-oleh-field)?:
while IFS=":" read -r user _
do
echo "crontab for user ${user}:"
crontab -u "$user" -l
done < /etc/passwd
Ini berbunyi /etc/passwd
baris demi baris menggunakan :
sebagai pembatas lapangan. Dengan mengatakan baca -r pengguna _
, kami membuat $user
mengadakan field pertama dan _
sisa (itu hanya sampah variabel untuk mengabaikan bidang).
Dengan cara ini, maka kita dapat menyebut crontab -u
menggunakan variabel $user
, yang kami kutip untuk keselamatan (apa yang jika mengandung spasi? Hal ini tidak mungkin di file tersebut, tapi anda tidak pernah tahu).