minutos manualmente instalar eliminar ejemplos ejecutar editar cada unix cron

unix - manualmente - eliminar crontab linux



¿Cómo enumero todos los trabajos cron para todos los usuarios? (22)

Construyendo encima de @Kyle

for user in $(tail -n +11 /etc/passwd | cut -f1 -d:); do echo $user; crontab -u $user -l; done

para evitar los comentarios generalmente en la parte superior de / etc / passwd,

Y en macosx

for user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done

¿Hay un comando o un script existente que me permita ver todos los trabajos cron programados de un sistema * NIX a la vez? Me gustaría incluir todos los crontabs de usuario, así como /etc/crontab , y lo que sea en /etc/cron.d . También sería bueno ver los comandos específicos ejecutados por run-parts en /etc/crontab .

Idealmente, me gustaría la salida en forma de columna agradable y ordenada de alguna manera significativa.

Luego podría combinar estas listas de varios servidores para ver el "calendario de eventos" general.

Estaba a punto de escribir un guión así, pero si alguien ya se ha metido en problemas ...


Creo que un mejor forro estaría por debajo. Por ejemplo, si tiene usuarios en NIS o LDAP, no estarán en / etc / passwd. Esto le dará los crontabs de cada usuario que ha iniciado sesión.

for I in `lastlog | grep -v Never | cut -f1 -d'' ''`; do echo $I ; crontab -l -u $I ; done


Depende de tu versión de cron. Usando Vixie cron en FreeBSD, puedo hacer algo como esto:

(cd /var/cron/tabs && grep -vH ^# *)

Si quiero que se elimine más la pestaña, podría hacer algo como esto:

(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/ /")

Donde hay una pestaña literal en la parte de reemplazo de sed.

Puede ser más independiente del sistema recorrer los usuarios en /etc/passwd y hacer crontab -l -u $user para cada uno de ellos.


Depende de tu versión de linux pero uso:

tail -n 1000 /var/spool/cron/*

como raíz Muy simple y muy corto.

Me da salida como:

==> /var/spool/cron/root <== 15 2 * * * /bla ==> /var/spool/cron/my_user <== */10 1 * * * /path/to/script


En Solaris, para un nombre de usuario conocido en particular:

crontab -l username

Todos los demás * Nix necesitarán -u modificador:

crontab -u username -l

Para obtener todos los trabajos de los usuarios a la vez en Solaris, al igual que otras publicaciones anteriores:

for user in $(cut -f1 -d: /etc/passwd); do crontab -l $user 2>/dev/null; done


En Ubuntu o Debian, puede ver crontab por /var/spool/cron/crontabs/ y luego hay un archivo para cada usuario allí. Eso es solo para crontab''s específico del usuario, por supuesto.


Este script envía el Crontab a un archivo y también enumera a todos los usuarios que confirman aquellos que no tienen entrada de 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


Este script me funcionó en CentOS para enumerar todos los crons en el entorno:

sudo cat /etc/passwd | sed ''s/^/([^:]*/):.*$/sudo crontab -u /1 -l 2>/&1/'' | grep -v "no crontab for" | sh


Esto mostrará todas las entradas de crontab de todos los usuarios.

sed ''s/^/([^:]*/):.*$/crontab -u /1 -l 2>/&1/'' /etc/passwd | grep -v "no crontab for" | sh


Gracias por este script muy útil. Tuve algunos pequeños problemas al ejecutarlo en sistemas antiguos (Red Hat Enterprise 3, que maneja diferentemente egrep y pestañas en cadenas), y otros sistemas sin nada en /etc/cron.d/ (la secuencia de comandos terminó con un error). Así que aquí hay un parche para que funcione en tales casos:

2a3,4 > #See: http://.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" |

No estoy realmente seguro de que los cambios en el primer egrep sean una buena idea, pero bueno, este script se ha probado en RHEL3,4,5 y Debian5 sin ningún problema. ¡Espero que esto ayude!


Lo siguiente elimina los comentarios, las líneas vacías y los errores de los usuarios sin crontab. Todo lo que te queda es una lista clara de los usuarios y sus trabajos.

Tenga en cuenta el uso de sudo en la segunda línea. Si ya eres root, quita eso.

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

Ejemplo de salida:

# ------ 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

Lo uso en Ubuntu (12 a 16) y Red Hat (5 a 7).


Me gusta la respuesta simple de una sola línea anterior:

para el usuario en $ (cortar -f1 -d: / etc / passwd); hacer crontab -u $ usuario -l; hecho

Pero Solaris, que no tiene el indicador -u y no imprime el usuario que está verificando, puede modificarlo así:

for user in $(cut -f1 -d: /etc/passwd); do echo User:$user; crontab -l $user 2>&1 | grep -v crontab; done

Obtendrá una lista de usuarios sin los errores generados por crontab cuando una cuenta no tiene permiso para utilizar cron, etc. Tenga en cuenta que en Solaris, los roles también pueden estar en / etc / passwd (consulte / etc / user_attr).


Para mí, ver / var / spool / cron / crontabs es la mejor manera


Para obtener la lista de usuario ROOT.

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


Puedes escribir para todas las listas de usuarios:

sudo crontab -u userName -l ,

También puedes ir a

cd /etc/cron.daily/ ls -l cat filename

este archivo listará los horarios

cd /etc/cron.d/ ls -l cat filename


Si selecciona un clúster utilizando NIS, la única forma de ver si un usuario tiene una entrada crontab es según la respuesta de Matt / var / spool / cron / tabs.

grep -v "#" -R /var/spool/cron/tabs


Tendrías que ejecutar esto como root, pero:

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

pasará sobre cada nombre de usuario enumerando su crontab. Los crontabs son propiedad de los respectivos usuarios, por lo que no podrá ver el crontab de otro usuario sin ser ellos o root.

Edite si desea saber a qué usuario pertenece un crontab, use echo $user

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


Terminé escribiendo un guión (estoy tratando de enseñarme los puntos más finos de las secuencias de comandos de bash, por eso es que no ves algo como Perl aquí). No es exactamente un asunto simple, pero hace la mayor parte de lo que necesito. Utiliza la sugerencia de Kyle para buscar crontabs de usuarios individuales, pero también trata con /etc/crontab (incluidos los scripts lanzados por run-parts en /etc/cron.hourly , /etc/cron.daily , etc.) y los trabajos en el directorio /etc/cron.d Toma todos esos y los combina en una pantalla como la siguiente:

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

Tenga en cuenta que muestra al usuario, y más o menos ordenados por hora y minuto para que pueda ver el programa diario.

Hasta ahora, lo he probado en Ubuntu, Debian y 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}"


Un pequeño refinamiento de la respuesta de Kyle Burton con un formato de salida mejorado:

#!/bin/bash for user in $(cut -f1 -d: /etc/passwd) do echo $user && crontab -u $user -l echo " " done


Ya que se trata de hacer un bucle a través de un archivo ( /etc/passwd ) y realizar una acción, me falta el enfoque adecuado sobre ¿Cómo puedo leer un archivo (flujo de datos, variable) línea por línea (y / o campo)? -por campo)? :

while IFS=":" read -r user _ do echo "crontab for user ${user}:" crontab -u "$user" -l done < /etc/passwd

Esto lee línea /etc/passwd línea /etc/passwd usando : como delimitador de campo. Al decir read -r user _ , hacemos que $user mantenga el primer campo y _ el resto (es solo una variable de correo no deseado para ignorar los campos).

De esta manera, podemos llamar a crontab -u usando la variable $user , que cotizamos por seguridad (¿qué sucede si contiene espacios? Es poco probable que se encuentre en dicho archivo, pero nunca se puede saber).


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


getent passwd | cut -d: -f1 | perl -e''while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print "$_/n$l/n" if $l}''

Esto evita que se ensucie con passwd directamente, omite a los usuarios que no tienen entradas de cron y para aquellos que las tienen, imprime el nombre de usuario y su crontab.

Aunque solté esto principalmente aquí, así podré encontrarlo más tarde en caso de que necesite buscarlo nuevamente.