Există o comandă sau un script existent care va lasa-ma sa vizualizati toate de un *NIX sistemul's programată cron de locuri de muncă la o dată? Am'd place să includă toate utilizator crontabs, precum și /etc/crontab, și orice's în
/etc/cron.d. De asemenea, ar fi frumos pentru a vedea comenzi specifice condusă de
run-piese de schimb " in " /etc/crontab`.
În mod ideal, am'd place de ieșire într-o frumoasă coloană formă și ordonat într-un mod semnificativ.
Am putea apoi să îmbinați aceste anunturi de la mai multe servere pentru a vizualiza ansamblu "programul de evenimente."
Am fost pe cale de a scrie un astfel de scenariu, dar dacă cineva's plecat deja la probleme...
Va trebui să rulați acest ca root, dar:
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
va bucla pe fiecare nume de utilizator listarea lor crontab. Crontabs sunt deținute de respectivii utilizatori, deci ai câștigat't fi capabil de a vedea un alt utilizator's crontab w/o curs de ele sau rădăcină.
Edit
dacă vrei să știi care utilizatorul o crontab aparține, folosi echo $user
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
Am terminat de scris un scenariu (I'm încercat să mă învețe cele mai bune puncte de bash scripting, deci, ca's de ce nu't vedea ceva de genul Perl aici). L'nu e chiar o afacere simplă, dar nu cele mai multe din ceea ce am nevoie. Folosește Kyle's sugestie pentru căutarea utilizatorii individuali' crontabs, dar, de asemenea, oferte cu /etc/crontab (inclusiv script-uri lansate de
run-piese de schimb " in " /etc/cron.detalii,
/etc/cron.de zi cu zi, etc.) și locuri de muncă în
/etc/cron.d` director. Este nevoie de toate cele și le reunește într-un ecran ceva de genul următor:
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
Rețineți că acesta arată de utilizator, și mai mult-sau-mai puțin felul de oră și minut, astfel încât să pot vedea programul de zi cu zi.
Până acum, am'am testat pe Ubuntu, Debian, și Red Hat CA.
#!/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}"
Sub Ubuntu sau debian, puteți vizualiza intrearea de /var/spool/cron/crontabs/
și apoi un fișier pentru fiecare utilizator este acolo. Ca's doar pentru user-specific crontab's, desigur.
Pentru Redhat 6/7 și Centos, crontab este sub /var/spool/cron/
.
Depinde ce versiune de linux, dar eu folosesc:
tail -n 1000 /var/spool/cron/*
ca root. Foarte simplu și foarte scurt.
Dă-mi de ieșire, cum ar fi:
==> /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}'
Acest lucru evită joc cu passwd direct, sare utilizatorii care nu au cron intrări și pentru cei care le au se imprimă afară de utilizator, precum și crontab.
Cea mai mare scadere cu ce-i aici așa că am putea găsi mai târziu în cazul în care am vreodată nevoie pentru a căuta din nou.
Îmi place simplu o-linie răspunsul de mai sus:
pentru utilizator în $(cut-f1 -d: /etc/passwd); face crontab -u $user -l; face
Dar Solaris care nu au -u pavilion și nu se imprimă utilizator it's de verificare, se poate modifica astfel:
for user in $(cut -f1 -d: /etc/passwd); do echo User:$user; crontab -l $user 2>&1 | grep -v crontab; done
Veți obține o listă de utilizatori fără erori aruncate de crontab atunci când un cont este permisă utilizarea cron etc. Fi conștienți de faptul că în Solaris, rolurile pot fi în /etc/passwd prea (vezi /etc/user_attr).
Următoarele benzi departe comentarii, linii goale, și erori de la utilizatorii care nu crontab. Tot ce're a lăsat cu o listă clară de utilizatori și locurile lor de muncă.
Notă utilizarea de "sudo" în a 2-a linie. Daca're deja root, scoateți asta.
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
Exemplu de ieșire:
# ------ 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
Eu folosesc asta pe Ubuntu (12 thru 16) și Red Hat (5 până la 7).
Depinde de versiunea de cron. Folosind Paznic cron pe FreeBSD, nu pot face ceva de genul asta:
(cd /var/cron/tabs && grep -vH ^# *)
dacă vreau mai multe tab deliminated, s-ar putea face ceva de genul asta:
(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/ /")
În cazul în care's un literal în fila sed înlocuirea parte.
Acesta poate fi mai independent de sistem pentru a bucla prin utilizatori, în /etc/passwd
și nu crontab -l-u $user
pentru fiecare dintre ele.
Multumesc pentru acest scenariu foarte util. Am avut unele mici probleme care rulează pe sistemele vechi (Red Hat Enterprise 3, care se ocupa în mod diferit egrep și file în siruri de caractere), și alte sisteme cu nimic în /etc/cron.d/ (script-ul atunci s-a încheiat cu o eroare). Deci, aici este un patch pentru a face să funcționeze în astfel de cazuri :
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" |
Am'm nu sunt foarte sigur de schimbările în primul egrep sunt o idee bună, dar, ei bine, acest script a fost testat pe RHEL3,4,5 și Debian5 fara nici o problema. Sper că acest lucru vă ajută!
Cu scuzele de rigoare și datorită yukondude.
Am'am încercat să rezum setări de sincronizare pentru o citire ușoară, deși l's nu un loc de muncă perfect, și eu nu't touch 'fiecare vineri' sau 'numai în zilele de luni' astea.
Aceasta este versiunea 10 - a acum:
Eu sunt acum publicarea script-ul în întregime aici.
https://gist.github.com/myshkin-uk/d667116d3e2d689f23f18f6cd3c71107
Clădire pe partea de sus de @Kyle
for user in $(tail -n +11 /etc/passwd | cut -f1 -d:); do echo $user; crontab -u $user -l; done
pentru a evita comentarii de obicei în partea de sus a /etc/passwd,
Și pe macosx
for user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done
Cred că una mai bună linie ar fi de mai jos. De exemplu, dacă aveți utilizatori din NIS sau LDAP ei n-ar fi în /etc/passwd. Acest lucru vă va oferi crontabs de fiecare utilizator care s-a logat.
for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done
puteți scrie pentru toate utilizator listă :
sudo crontab -u userName -l
,
Puteți merge, de asemenea, pentru a
cd /etc/cron.daily/
ls -l
cat filename
acest fișier va lista programe
cd /etc/cron.d/
ls -l
cat filename
Deoarece este o chestiune de looping printr-un fișier (/etc/passwd
) și efectuează o acțiune, îmi lipsește o abordare pe Cum pot citi un fișier (flux de date, variabile) linie-cu-linie (și/sau teren-de-câmp)?:
while IFS=":" read -r user _
do
echo "crontab for user ${user}:"
crontab -u "$user" -l
done < /etc/passwd
Acest lucru se citește /etc/passwd
linie cu linie folosind :
ca delimitator de câmp. Prin a spune citit -r utilizatorului _
, vom face $user
dețină primul câmp și _
restul (este doar un gunoi variabilă a ignora domenii).
În acest fel, putem numi crontab -ufolosind variabila$user
, care cităm pentru siguranță (dacă acesta conține spații? Este puțin probabil ca în astfel de fișier, dar nu poți ști niciodată).