Is er een commando of een bestaand script waarmee ik alle geplande cron jobs van een *NIX systeem in één keer kan bekijken? Ik zou willen dat het alle crontabs van de gebruiker bevat, evenals /etc/crontab
, en wat er ook in /etc/cron.d
staat. Het zou ook leuk zijn om de specifieke commando's te zien die door run-parts
in /etc/crontab
worden uitgevoerd.
Idealiter zou ik de uitvoer in een mooie kolomvorm willen hebben en op een zinvolle manier geordend.
Ik zou dan deze lijsten van meerdere servers kunnen samenvoegen om het totale "schema van gebeurtenissen." te bekijken;
Ik stond op het punt om zelf zo'n script te schrijven, maar als iemand'al de moeite heeft genomen...
Je zou dit als root moeten draaien, maar:
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
zal een lus maken over elke gebruikersnaam en hun crontab opnoemen. De crontabs zijn eigendom van de respectieve gebruikers dus je zal niet in staat zijn om de crontab van een andere gebruiker te zien zonder hem of root te zijn.
Edit
als je wilt weten aan welke gebruiker een crontab toebehoort, gebruik dan echo $user
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
Ik heb uiteindelijk een script geschreven (ik'probeer mezelf de fijne kneepjes van bash scripting te leren, dus dat'is de reden waarom je hier niet iets als Perl ziet). Het's niet bepaald een eenvoudige zaak, maar het doet het meeste van wat ik nodig heb. Het gebruikt Kyle's suggestie voor het opzoeken van individuele gebruikers'crontabs, maar behandelt ook /etc/crontab
(inclusief de scripts gelanceerd door run-parts
in /etc/cron.hourly
, /etc/cron.daily
, enz.) en de jobs in de /etc/cron.d
directory. Het neemt al deze jobs en voegt ze samen in een scherm dat er ongeveer als volgt uitziet:
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 op dat het de gebruiker laat zien, en min of meer sorteert op uur en minuut, zodat ik het dagelijkse schema kan zien.
Tot nu toe heb ik het getest op Ubuntu, Debian, en 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}"
Hangt van je versie van cron af. Met Vixie cron op FreeBSD, kan ik iets als dit doen:
(cd /var/cron/tabs && grep -vH ^# *)
Als ik het meer tab-gelimineerd wil, zou ik zoiets als dit kunnen doen:
(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/ /")
Waar dat'een letterlijke tab is in het sed vervangingsgedeelte.
Het kan meer systeem onafhankelijk zijn om door de gebruikers in /etc/passwd
te lopen en crontab -l -u $user
voor elk van hen te doen.