Finnes det en kommando eller et eksisterende skript som lar meg se alle * NIX-systemets planlagte cron-jobber samtidig? Jeg vil gjerne at det skal inkludere alle brukerens crontabs, samt /etc/crontab
, og hva som helst i /etc/cron.d
. Det ville også være fint å se de spesifikke kommandoene som kjøres av run-parts
i /etc/crontab
.
Ideelt sett vil jeg ha utdataene i en fin kolonneform og ordnet på en meningsfull måte.
Jeg kunne deretter slå sammen disse oppføringene fra flere servere for å se den samlede " tidsplan for hendelser."
Jeg var i ferd med å skrive et slikt skript selv, men hvis noen allerede har tatt seg bryet ...
Du må kjøre dette som root, men:
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
vil løkke over hvert brukernavn og liste opp deres crontab. Crontabene eies av de respektive brukerne, så du vil ikke kunne se en annen brukers crontab uten å være dem eller root.
Rediger
hvis du vil vite hvilken bruker en crontab tilhører, bruk echo $user
.
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
Jeg endte opp med å skrive et skript (jeg prøver å lære meg de finere punktene i bash-skripting, så det er derfor du ikke ser noe som Perl her). Det er ikke akkurat en enkel affære, men det gjør det meste av det jeg trenger. Den bruker Kyle's forslag for å slå opp individuelle brukere' crontabs, men tar også for seg /etc/crontab
(inkludert skriptene lansert av run-parts
i /etc/cron.hourly
, /etc/cron.daily
, etc.) og jobbene i /etc/cron.d
katalogen. Den tar alle disse og slår dem sammen til en skjerm som ser ut som følgende:
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
Merk at det viser brukeren, og mer eller mindre sorterer etter time og minutt, slik at jeg kan se den daglige timeplanen.
Så langt har jeg testet det på Ubuntu, Debian og 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}"
Avhenger av din versjon av cron. Ved å bruke Vixie cron på FreeBSD kan jeg gjøre noe sånt som dette:
(cd /var/cron/tabs && grep -vH ^# *)
hvis jeg vil ha det mer faneavgrenset, kan jeg gjøre noe sånt som dette:
(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/ /")
Hvor det er en bokstavelig fane i sed-erstatningsdelen.
Det kan være mer systemuavhengig å løkke gjennom brukerne i /etc/passwd
og gjøre crontab -l -u $user
for hver av dem.