如何列出所有用户的所有cron作业?
有一个命令或现有的脚本,可以让我一次查看所有* NIX系统的预定cron作业吗? 我希望它包含所有用户crontabs,以及/etc/crontab
,以及/etc/cron.d
。 看到由/etc/crontab
run-parts
运行的特定命令也是很好的。
理想情况下,我想输出一个很好的列forms,并以一些有意义的方式sorting。
然后,我可以合并这些来自多个服务器的列表来查看整个“事件日程安排”。
我正准备自己写这样一个剧本,但是如果有人已经麻烦了…
你将不得不以root身份运行它,但是:
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
将遍历每个用户名列出他们的crontab。 crontabs由相应的用户拥有,所以你将无法看到另一个用户的crontab不是他们或者root。
如果你想知道一个crontab属于哪个用户,请编辑 echo $user
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
我最终写了一个脚本(我试图自我教导bash脚本的更精细的点,所以这就是为什么你在这里看不到像Perl这样的东西)。 这不完全是一件简单的事情,但它大部分是我需要的。 它使用Kyle的build议来查找个人用户的crontabs,而且还处理/etc/crontab
(包括由/etc/cron.daily
等run-parts
启动的脚本)和作业在/etc/cron.d
目录下。 它把所有这些都合并成一个如下所示的显示:
mi hdmw 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
请注意,它显示了用户,并且按小时和分钟sorting,以便我可以看到每天的时间表。
到目前为止,我已经在Ubuntu,Debian和Red Hat AS上进行了testing。
#!/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}"
在Ubuntu或debian下,你可以通过/var/spool/cron/crontabs/
查看crontab,然后为每个用户提供一个文件。 这当然只适用于用户特定的crontab。
这将显示所有用户的所有crontab条目。
sed 's/^\([^:]*\):.*$/crontab -u \1 -l 2>\&1/' /etc/passwd | grep -v "no crontab for" | sh
取决于你的Linux版本,但我使用:
tail -n 1000 /var/spool/cron/*
作为根。 非常简单,很短。
给我这样的输出:
==> /var/spool/cron/root <== 15 2 * * * /bla ==> /var/spool/cron/my_user <== */10 1 * * * /path/to/script
凯尔·伯顿(Kyle Burton)提供的改进输出格式的小小改进:
#!/bin/bash for user in $(cut -f1 -d: /etc/passwd) do echo $user && crontab -u $user -l echo " " done
getent passwd | cut -d: -f1 | perl -e'while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print "$_\n$l\n" if $l}'
这可以避免直接与passwd混淆,跳过没有cron条目的用户,为那些拥有它们的用户打印出用户名以及他们的crontab。
大多数情况下,在这里,但我可以find它,以防万一我需要再次search它。
如果您使用NIS检查群集,则根据Matt的答案/ var / spool / cron / tabs,查看用户是否具有crontab条目的唯一方法是。
grep -v "#" -R /var/spool/cron/tabs
我喜欢上面简单的一行代码的答案:
用户在$(cut -f1 -d:/ etc / passwd); 做crontab -u $ user -l; DONE
但是没有-u标志的Solaris并不打印正在检查的用户,你可以这样修改它:
for user in $(cut -f1 -d: /etc/passwd); do echo User:$user; crontab -l $user 2>&1 | grep -v crontab; done
当一个账户不允许使用cron时,你将得到没有crontab抛出错误的用户列表。注意,在Solaris中,angular色也可以在/ etc / passwd中(参见/ etc / user_attr)。
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
取决于你的cron版本。 在FreeBSD上使用Vixie cron,我可以这样做:
(cd /var/cron/tabs && grep -vH ^# *)
如果我想要更多的选项卡删除,我可能会这样做:
(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/ /")
这是sedreplace部分中的字面标签。
在/etc/passwd
循环访问用户可能更独立于系统,并为每个crontab -l -u $user
执行crontab -l -u $user
。
以下消除注释,空行和来自没有crontab的用户的错误。 你只剩下一个明确的用户和他们的工作清单。
注意在第二行使用sudo
。 如果你已经是root的,删除它。
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
示例输出:
# ------ 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
我在Ubuntu(12到16)和Red Hat(5到7)上使用它。
感谢这个非常有用的脚本。 我在旧系统上运行它(Red Hat Enterprise 3,它在string中处理不同的egrep和tabs)和其他在/etc/cron.d/中没有任何内容的系统(脚本然后以错误结束)有一些小问题。 所以这里是一个补丁,使其在这种情况下工作:
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" |
我不确定第一个egrep的变化是一个好主意,但是,这个脚本已经在RHEL3,4,5和Debian5上testing了,没有任何问题。 希望这可以帮助!
build立在@凯尔之上
for user in $(tail -n +11 /etc/passwd | cut -f1 -d:); do echo $user; crontab -u $user -l; done
避免通常位于/ etc / passwd顶部的注释,
在macosx上
for user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done
我认为更好的一个class轮将在下面。 例如,如果你有NIS或LDAP用户,他们不会在/ etc / passwd中。 这会给你login每个用户的crontabs。
for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done
你可以写所有的用户列表:
sudo crontab -u userName -l ,
你也可以去
cd /etc/cron.daily/ ls -l cat filename
这个文件将列出时间表
cd /etc/cron.d/ ls -l cat filename
由于它是通过文件( /etc/passwd
)循环并执行操作的问题,所以我错过了正确的方法如何逐行读取文件(数据stream,variables)(和/或字段逐场)? :
while IFS=":" read -r user _ do echo "crontab for user ${user}:" crontab -u "$user" -l done < /etc/passwd
这读取/etc/passwd
行:
使用:
作为字段分隔符。 通过说read -r user _
,我们让$user
保存第一个字段,其余的(只是一个垃圾variables忽略字段)。
这样,我们可以使用variables$user
来调用crontab -u
,我们引用这个variables是为了安全(如果它包含空格呢?在这个文件中不太可能,但永远不会知道)。
这个脚本在CentOS中为我工作,列出环境中的所有cron:
sudo cat /etc/passwd | sed 's/^\([^:]*\):.*$/sudo crontab -u \1 -l 2>\&1/' | grep -v "no crontab for" | sh
对我来说看看/ var / spool / cron / crontabs是最好的方法
该脚本将Crontab输出到文件,并列出所有用户确认没有crontab条目的用户:
for user in $(cut -f1 -d: /etc/passwd); do echo $user >> crontab.bak echo "" >> crontab.bak crontab -u $user -l >> crontab.bak 2>> > crontab.bak done