¿Cómo agrego una entrada a mi crontab?

13

Estoy usando crontab por primera vez. Desea escribir algunas tareas cron de prueba muy simples y ejecutarlas.

$crontab * * * * * echo "Hi"

no produce nada

crontab */1 * * * * echo "hi"

dice */1: No such file or directory.

Además, ¿cómo enumero las tareas cron que se están ejecutando actualmente (no solo las que poseo, sino también las iniciadas por otros usuarios, como root).

¿Y cómo elimino una tarea cron particular?

xyz
fuente
Para obtener instrucciones sobre cómo editar y crear trabajos cron y una explicación sobre la estructura de los archivos, consulte esta guía de sintaxis crontab
KJS el

Respuestas:

21

No puedes usar crontabasí. Use man crontabpara leer sobre la forma correcta de llamar a esta utilidad.

Deberá utilizar crontab -epara editar las entradas cron del usuario actual (puede agregar / modificar / eliminar líneas). Use crontab -lpara ver la lista actual de tareas configuradas.

En cuanto a ver crontabs de otros usuarios, eso no es posible sin ser root en las instalaciones predeterminadas. Consulte Cómo enumero todos los trabajos cron para todos los usuarios para ver algunas formas de enumerar todo (como root).

Nota: tenga mucho cuidado cuando utilice caracteres de globo de shell en la línea de comando ( *y ?especialmente). *se expandirá a la lista de archivos en el directorio actual, lo que puede tener efectos inesperados. Si desea pasar *como argumento a algo, cítelo ( '*').

Estera
fuente
entonces hago crontab -e y en el editor pongo la entrada * / 1 * * * * echo "hola" y cuando guardo este archivo, veo el mensaje que crontab: instalando el nuevo crontab. pero no veo los mensajes de saludo que aparecen en la pantalla. ¿Qué me estoy perdiendo ahora? Gracias.
xyz
2
La salida de crontab nunca irá a su "pantalla". Desde la página de manual POSIX para crontab: "Si la salida estándar y el error estándar no son redirigidos por comandos ejecutados desde la entrada crontab, cualquier salida o error generado se enviará por correo, a través de un método dependiente de la implementación, al usuario".
Mat
1
La salida del trabajo se enviará al buzón local del propietario del trabajo. (Ejecución mailde la línea de comandos debe tener acceso a su buzón de correo local, si está configurado.) Para ver la 'hola' en entorno gráfico, puede configurar la tarea como: * * * * * export DISPLAY=:0; xmessage 'hi'.
manatwork
@manatwork También puede necesitar XAUTHORITY, que puede no ser fácil .
derobert
7

Hay dos formas de editar uno crontab:

  1. interactivamente, usando crontab -e, que abrirá crontaben el editor especificado por $VISUALo $EDITOR, o

  2. de forma no interactiva, usando crontab crontab.txt, lo que simplemente importará las crontabentradas del archivo crontab.txt, reemplazando el crontab activo existente para el usuario actual.

El problema que tiene es que simplemente está usando el crontabcomando incorrectamente.


Lo siguiente se refiere a la manipulación de crontab no interactiva:

Entonces, para eliminar tareas particulares mediante programación, podrías hacer algo como

$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt

donde PATTERNes una expresión regular que coincidirá con las tareas que desea eliminar. Aquí, crontab -lte daremos tu actual crontab.

O, si tiene entradas en un archivo llamado crontab-fragment.txtque desea eliminar del crontab activo,

$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt

Esto lee el crontab actual y filtra (elimina) cualquier línea que también ocurra en el archivo crontab-fragment.txten el directorio actual (usando una comparación de cadena de línea completa). El resultado se guarda crontab.txty luego se carga desde allí para reemplazar el crontab actual.

Para agregar una o varias tareas , haga algo como

$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt

Esto supone que el archivo crontab-fragment.txtcontiene las entradas que desea agregar. Lee el crontab actual, agrega las entradas de crontab-fragment.txta esto y crea crontab.txt. El crontab.txtarchivo luego reemplaza el crontab actual.

Kusalananda
fuente
2

Si desea modificar el crontab de forma interactiva, ejecute el comando crontab -e, sin otra opción. Esto iniciará un editor en una copia del crontab; Cuando salga del editor , la copia editada se convertirá en el nuevo crontab. Puede controlar qué editor se inicia a través de las VISUALy EDITORvariables de entorno . Para enumerar su crontab, ejecute crontab -l.

Si desea modificar el crontab en una secuencia de comandos, configure VISUALy EDITORla ruta a una secuencia de comandos o un fragmento de shell que modifique el archivo suministrado en su lugar. El editor edes una posibilidad aquí, o sed -isi su implementación de sedtiene esta opción. Si desea agregar una línea incondicionalmente, puede usarla echo … >>. Tenga cuidado con las citas; en caso de duda, escriba un guión y pase el nombre del guión como EDITOR.

script=$(mktemp)
cat <<'EOF' >"$script"
#!/bin/sh
ed -s "$1" <<'EOS'
g/^ *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *echo "hi"$/d
$a
* * * * * echo "hi"
.
w
q
EOS
EOF
Gilles 'SO- deja de ser malvado'
fuente
2

Esto es un poco tarde, pero para otros que buscan aquí. Hay formas más fáciles que manipular las secuencias de entrada / salida con VISUALy EDITOR.

Simplemente puede escribir su cronograma en un archivo, 1 trabajo por línea, y usar el comando crontab [filename]para que pueda realizar catsus trabajos filenamecomo parte de su script y, finalmente, llamar a crontab al final si lo desea.

de hecho, este es el uso más común como man crontabpistas al enumerarlo primero

Lindsay Ryan
fuente
2

Si desea agregar entradas a la crontabautomatización o desde la línea de comandos, puede hacerlo (estableciendo los tiempos que desea tener)

echo "* * * * * /yourpath/yourcommand 2>&1 >> /var/log/somelog.log" >> /var/spool/cron/root (or appropriate username)

Luego:

service crond reload

para recargar las crontabs.

Chris Sprucefield
fuente
Esto no es portable; no todos los archivos de Unix almacenan los archivos crontab /var/spool/cron. Una mejor manera sería a través del crontab(1)comando.
thrig
Eso puede ser cierto, pero fue para mostrar el principio de cómo puede hacerlo en un sistema, y ​​sí, crontab hace el truco si desea agregar línea por línea. No estaba destinado a ser una respuesta absoluta, sino una si sabes dónde están tus cosas y necesitas agregar en masa. Tómalo por lo que es.
Chris Sprucefield
1

Pruébalo con este comando:

crontab -e 

luego agregue su trabajo cron:

*/1 * * * * echo "hi"

en ese archivo

usuario158204
fuente
0

Me gustaría resaltar la forma en que describo a continuación, aunque se ha mencionado anteriormente en otro comentario. Lo encontré extremadamente útil al agregar las entradas a un archivo y luego agregar el archivo a crontab. Ese archivo contendría las dos entradas a continuación y el nombre del archivo sería hello-world-crontab.txt.

  • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • 0 09 * * * python /home/user/greeting.py

Luego, ejecuté el siguiente comando para agregar estas entradas al crontab.

  • $ crontab hello-world-crontab.txt

El siguiente paso es verificar que se hayan agregado estas entradas.

  • $ crontab -l

Una breve explicación de lo que hace cada entrada:

  • Esta entrada de crontab escribe "¡Hola, mundo!" en el archivo /home/user/greeting.txttodos los días a las 9 a.m.
    • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • Este crontab ejecuta un archivo python que se imprime en la línea de comando '¡Hola mundo!' todos los días a las 9 a.m.
    • 0 09 * * * python /home/user/greeting.py
SylvesterAbreuLoreto
fuente