Vai ir kāda komanda vai esošs skripts, kas ļauj vienlaikus apskatīt visus *NIX sistēmas plānotos cron uzdevumus? Es gribētu, lai tas ietvertu visas lietotāja crontabs, kā arī /etc/crontab
un visu, kas ir /etc/cron.d
. Būtu arī jauki redzēt konkrētas komandas, ko run-parts
izpilda /etc/crontab
.
Ideālā gadījumā es gribētu, lai izvades rezultāti būtu skaista slejas formā un sakārtoti kādā jēgpilnā veidā.
Pēc tam es varētu apvienot šos sarakstus no vairākiem serveriem, lai apskatītu kopējo "notikumu grafiku."
Es gatavojos pats uzrakstīt šādu skriptu, bet, ja kāds jau ir to darījis...
Jums tas būtu jāpalaiž kā root, bet:
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
cilpa pārskanēs pāri katram lietotāja vārdam, uzskaitot viņa crontab. Crontabs pieder attiecīgajiem lietotājiem, tāpēc jūs nevarēsiet redzēt cita lietotāja crontab, ja nebūsiet viņš vai root.
Edit
ja vēlaties uzzināt, kuram lietotājam pieder crontab, izmantojiet echo $user
.
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
Es galu galā rakstot skriptu (Es'esmu mēģina iemācīt sev smalkākos punktus bash skriptu, so that's why you don't redzēt kaut ko līdzīgu Perl šeit). Tas nav gluži vienkāršs, bet dara lielāko daļu no tā, kas man vajadzīgs. Tas izmanto Kyle's ieteikumu atsevišķu lietotāju crontabs meklēšanai, bet arī strādā ar /etc/crontab
(ieskaitot skriptus, ko palaiž run-parts
/etc/cron.hourly
, /etc/cron.daily
u.c.) un uzdevumiem /etc/cron.daily
direktorijā. Tas ņem visus šos datus un apvieno tos displejā, kas ir līdzīgs šādam:
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
Ievērojiet, ka tas parāda lietotāju un vairāk vai mazāk šķiro pēc stundām un minūtēm, lai es varētu redzēt dienas grafiku.
Līdz šim esmu to izmēģinājis Ubuntu, Debian un 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}"
Atkarībā no cron versijas. Izmantojot Vixie cron uz FreeBSD, es varu rīkoties šādi:
(cd /var/cron/tabs && grep -vH ^# *)
ja es vēlos, lai tas būtu sadalīts pa cilnēm, es varētu darīt kaut ko tādu:
(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/ /")
kur tas ir burtiska tabulators sed aizvietošanas daļā.
Tas var būt neatkarīgāk no sistēmas, ja cilpa iziet cauri lietotājiem /etc/passwd
un katram no tiem veic crontab -l -u $user
.