как мне перечислить все задания cron для всех пользователей?

<p>есть ли команда или существующий сценарий, который позволит мне просматривать все запланированные задания cron системы * nix одновременно? я бы хотел, чтобы он включал все пользовательские crontabs, а также <code>/etc/crontab</code> и все, что есть в <code>/etc/cron.d</code>. также было бы хорошо видеть конкретные команды, выполняемые <code>run-parts</code> в <code>/etc/crontab</code>.</p><p>в идеале я хотел бы, чтобы выходные данные были в форме столбца nice и упорядочены каким-либо осмысленным образом.</p><p>затем я мог бы объединить эти списки с нескольких серверов, чтобы просмотреть общий "график событий".</p><p>я собирался написать такой сценарий сам, но если кто-то уже пошел на неприятности ...</p>

<p>в итоге я написал сценарий (я пытаюсь научить себя тонкостям написания сценариев bash, поэтому здесь вы не видите ничего похожего на perl). это не совсем простое дело, но оно делает большую часть того, что мне нужно. он использует предложение кайла для поиска crontabs отдельных пользователей, но также имеет дело с <code>/etc/crontab</code> (включая скрипты, запущенные <code>run-parts</code> в <code>/etc/cron.hourly</code>, <code>/etc/cron.daily</code> и т.д.) и заданиями в каталоге <code>/etc/cron.d</code>. он берет все это и объединяет их в нечто вроде следующего:</p><pre><code>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 обратите внимание, что он показывает пользователя и более-менее сортирует по часам и минутам, чтобы я мог видеть ежедневное расписание.до сих пор я тестировал его на ubuntu, debian и red hat as.<pre class="lang-sh prettyprint-override">#!/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+) +(.*)$/1t2t3t4t5t6t7/" | 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}" </code></pre>

<p>вы должны запустить это как root, но:</p><pre><code>for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done </code></pre><p>будет зацикливаться на каждом имени пользователя, перечисляя его crontab. crontabs принадлежат соответствующим пользователям, поэтому вы не сможете увидеть crontab другого пользователя без них или root.</p><hr><p><strong>edit</strong> если вы хотите знать, какому пользователю принадлежит crontab, используйте <code>echo $userfor user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done </code></pre>

<p>в ubuntu или debian вы можете просмотреть crontab с помощью <code>/var/spool/cron/crontabs/</code>, а затем файл для каждого пользователя. это только для пользовательских crontab, конечно.</p><p>для redhat 6/7 и centos crontab находится под <code>/var/spool/cron/</code>.</p>

<p>это покажет все записи crontab от всех пользователей.</p><pre><code>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 

небольшое уточнение ответа кайла бертона с улучшенным форматированием вывода:#!/bin/bash for user in $(cut -f1 -d: /etc/passwd) do echo $user && crontab -u $user -l echo " " done </code></pre>

<pre><code>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.главным образом, опуская это здесь, так что я могу найти это позже, если мне когда-нибудь понадобится искать его снова.

если вы проверяете кластер с помощью nis, единственный способ проверить, есть ли у пользователя запись в crontab, соответствует ответу matt's/var/spool/cron/tabs.grep -v "#" -r /var/spool/cron/tabs 

этот скрипт работал для меня в centos, чтобы перечислить все кроны в среде:sudo cat /etc/passwd | sed 's/^([^:]):.$/sudo crontab -u \1 -l 2>\&1/' | grep -v "no crontab for" | sh </code></pre>

<p>мне нравится простой однострочный ответ выше:</p><blockquote> <p>для пользователя в $ (cut -f1 -d:/etc/passwd); do crontab -u $ user -l; сделанный</p> </blockquote><p>но в solaris, который не имеет флага -u и не печатает проверяемого пользователя, вы можете изменить его следующим образом:</p><pre><code>for user in $(cut -f1 -d: /etc/passwd); do echo user:$user; crontab -l $user 2>&1 | grep -v crontab; done вы получите список пользователей без ошибок, выдаваемых crontab, когда учетной записи не разрешено использовать cron и т.д. помните, что в solaris роли также могут быть в/etc/passwd (см./etc/user_attr).

for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done </code></pre>

<p>получить список от пользователя root.</p><pre><code>for user in $(cut -f1 -d: /etc/passwd); do echo $user; sudo crontab -u $user -l; done 

далее удаляются комментарии, пустые строки и ошибки от пользователей без crontab. все, что вам осталось, это четкий список пользователей и их рабочих мест.обратите внимание на использование sudo во 2-й строке. если вы уже 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 </code></pre><p>пример вывода:</p><pre><code># ------ 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 </code></pre><p>я использую это на ubuntu (с 12 по 16) и red hat (с 5 по 7).</p>

<p>зависит от вашей версии cron. используя vixie cron во freebsd, я могу сделать что-то вроде этого:</p><pre><code>(cd /var/cron/tabs && grep -vh ^# *) </code></pre><p>если я хочу, чтобы вкладка была удалена, я мог бы сделать что-то вроде этого:</p><pre><code>(cd /var/cron/tabs && grep -vh ^# * | sed "s/:/ /") </code></pre><p>где это буквальная вкладка в части замены sed.</p><p>это может быть более системно независимым, чтобы проходить через пользователей в <code>/etc/passwd</code> и делать <code>crontab -l -u $user для каждого из них.

спасибо за этот очень полезный скрипт. у меня были небольшие проблемы с запуском его на старых системах (red hat enterprise 3, которые по-разному обрабатывают egrep и табуляции в строках), а также на других системах, где ничего не было в /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" | </code></pre><p>я не совсем уверен, что изменения в первом egrep - хорошая идея, но этот скрипт без проблем протестирован на rhel3,4,5 и debian5. надеюсь это поможет!</p>

<p>вы можете написать для всего списка пользователей:</p><pre><code>sudo crontab -u username -l , </code></pre><p>вы также можете перейти к</p><pre><code>cd /etc/cron.daily/ ls -l cat filename </code></pre><p>этот файл будет перечислять расписание</p><pre><code>cd /etc/cron.d/ ls -l cat filename </code></pre>

<p>здание на вершине @kyle</p><pre><code>for user in $(tail -n +11 /etc/passwd | cut -f1 -d:); do echo $user; crontab -u $user -l; done чтобы избежать комментариев обычно вверху/etc/passwd,и на macosxfor user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done </code></pre>

<p>с извинениями и благодаря юкондуде.</p><p>я попытался суммировать настройки времени для легкого чтения, хотя это не идеальная работа, и я не касаюсь вещей "каждую пятницу" или "только по понедельникам".</p><p>это версия 10 - это сейчас:</p><ul> <li>работает намного намного быстрее</li> <li>имеет дополнительные символы прогресса, чтобы вы могли улучшить скорость дальше.</li> <li>использует разделительную линию для разделения заголовка и вывода.</li> <li>выводит в компактном формате, когда все временные интервалы без учета могут быть суммированы.</li> <li>принимает январь ... декабрьские дескрипторы месяцев года</li> <li>принимает пн ... солнечные дескрипторы для дней недели</li> <li>пытается обработать анакрон в стиле debian, когда он отсутствует</li> <li>пытается обработать строки crontab, которые запускают файл после предварительного тестирования исполняемости, используя "[-x ...]"</li> <li>пытается обработать строки crontab, которые запускают файл после предварительного тестирования исполняемости, используя команду -v</li> <li>позволяет использовать интервалы и списки.</li> <li>поддерживает использование частей выполнения в пользовательских файлах/var/spool crontab.</li> </ul><p>сейчас я публикую сценарий полностью здесь.</p><p> <a href="https://gist.github.com/myshkin-uk/d667116d3e2d689f23f18f6cd3c71107">https://gist.github.com/myshkin-uk/d667116d3e2d689f23f18f6cd3c71107</a> </p>

<p>я думаю, что лучший вкладыш будет ниже. например, если у вас есть пользователи в nis или ldap, они не будут в/etc/passwd. это даст вам crontabs каждого пользователя, который вошел в систему.</p><pre><code>for i in `lastlog | grep -v never | cut -f1 -d' '`; do echo $i ; crontab -l -u $i ; done </code></pre>

<p>поскольку речь идет о циклическом просмотре файла (<code>/etc/passwd</code>) и выполнении действия, я упускаю правильный подход к <a href="http://mywiki.wooledge.org/bashfaq/001">как я могу прочитать файл (поток данных, переменную) построчно (и/или поле за полем)</a> :</p><pre><code>while ifs=":" read -r user \_ do echo "crontab for user ${user}:" crontab -u "$user" -l done < /etc/passwd </code></pre><p>это читает <code>/etc/passwd</code> построчно, используя <code>:</code> в качестве разделителя полей. сказав <code>read -r user \_</code>, мы заставляем <code>$user держать первое поле, а _ - остальное (это просто нежелательная переменная для игнорирования полей).таким образом, мы можем затем вызвать crontab -u, используя переменную $user</code>, которую мы цитируем для безопасности (что, если она содержит пробелы? в этом файле это маловероятно, но вы никогда не узнаете).</p>

<p>в solaris для определенного известного имени пользователя:</p><pre><code>crontab -l username </code></pre><p>всем остальным * nix понадобится модификатор <code>-u</code>:</p><pre><code>crontab -u username -l </code></pre><p>чтобы получить все пользовательские вакансии одновременно в solaris, как и в других постах выше:</p><pre><code>for user in $(cut -f1 -d: /etc/passwd); do crontab -l $user 2>/dev/null; done </code></pre>