¿Tiene crontab un argumento para crear trabajos cron sin usar el editor (crontab -e)? Si es así, ¿cuál sería el código para crear un cronjob desde un script de Bash?
Puede agregar al crontab de la siguiente manera:
#write out current crontab crontab -l > mycron #echo new cron into cron file echo "00 09 * * 1-5 echo hello" >> mycron #install new cron file crontab mycron rm mycron
* * * * * "command to be executed" - - - - - | | | | | | | | | ----- Day of week (0 - 7) (Sunday=0 or 7) | | | ------- Month (1 - 12) | | --------- Day of month (1 - 31) | ----------- Hour (0 - 23) ------------- Minute (0 - 59)
Fuente nixCraft .
Es posible que pueda hacerlo sobre la marcha
crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
crontab -l
lista los trabajos actuales de crontab, cat
imprime, echo
imprime el nuevo comando y crontab -
agrega todo el material impreso en el archivo crontab. Puede ver el efecto haciendo un nuevo crontab -l
.
Este más corto no requiere ningún archivo temporal, es inmune a múltiples inserciones y le permite cambiar el cronogtwig de una entrada existente.
Digamos que tienes estos:
croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1" cronjob="0 */15 * * * $croncmd"
Para agregarlo al crontab, sin duplicación:
( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -
Para eliminarlo del crontab cualquiera que sea su horario actual:
( crontab -l | grep -v -F "$croncmd" ) | crontab -
Notas:
Gracias a todos por su ayuda. Remontándome a lo que encontré aquí y en otro lugar, se me ocurrió esto:
command="php $INSTALL/indefero/scripts/gitcron.php" job="0 0 * * 0 $command" cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
No pude encontrar la manera de eliminar la necesidad de las dos variables sin repetirme.
command
es obviamente el comando que quiero progtwigr. job
toma $command
y agrega los datos de progtwigción. Necesitaba ambas variables por separado en la línea de código que hace el trabajo.
<(*command*)
) para convertir la salida de crontab -l
en entrada para el comando fgrep
. fgrep
luego filtra cualquier coincidencia de $command
(opción -v
), insensible a mayúsculas y minúsculas (opción -i
). <(*command*)
) se usa para convertir el resultado de nuevo en entrada para el comando cat
. cat
también recibe el echo "$job"
(que se explica por sí mismo), de nuevo, mediante el uso de la función de redireccionamiento ( <(*command*)
). crontab -l
y del echo "$job"
simple echo "$job"
, combinados, se transmiten ('|') a crontab -
para finalmente escribirse. Esta línea de código filtra cualquier tarea cron que coincida con el comando, luego escribe las tareas cron restantes con la nueva, actuando efectivamente como una función "agregar" o "actualizar". Para usar esto, todo lo que tiene que hacer es intercambiar los valores para el command
y job
variables de job
.
EDITAR (sobrescritura fija):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
Ha habido muchas respuestas buenas sobre el uso de crontab, pero no se menciona un método más simple, como usar cron
.
El uso de cron
aprovecharía los archivos y directorios del sistema ubicados en /etc/crontab
, /etc/cron.daily,weekly,hourly
o /etc/cron.d/
:
cat > /etc/cron.d/ << EOF SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 01 * * * * EOF
En este ejemplo anterior, creamos un archivo en /etc/cron.d/
, proporcionamos las variables de entorno para que el comando se ejecutara con éxito y proporcionamos al user
el comando y el command
sí. Este archivo no debe ser ejecutable y el nombre solo debe contener alfanuméricos y guiones (más detalles a continuación).
Sin embargo, para dar una respuesta completa, veamos las diferencias entre crontab
vs cron/crond
:
crontab -- maintain tables for driving cron for individual users
Para aquellos que desean ejecutar el trabajo en el contexto de su usuario en el sistema, usar crontab
puede tener mucho sentido.
cron -- daemon to execute scheduled commands
Para aquellos que usan administración de configuración o quieren administrar trabajos para otros usuarios, en cuyo caso debemos usar cron
.
Un extracto rápido de las páginas de manual le ofrece algunos ejemplos de qué hacer y qué no hacer:
/ etc / crontab y los archivos en /etc/cron.d deben ser propiedad de root, y no deben ser de escritura de grupo ni de otro tipo. En contraste con el área del spool, los archivos en /etc/cron.d o los archivos en /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly y /etc/cron.monthly también pueden ser enlaces simbólicos, siempre que tanto el enlace simbólico como el archivo al que apunta sean propiedad de root. Los archivos en /etc/cron.d no necesitan ser ejecutables, mientras que los archivos en /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly y /etc/cron.monthly, como son ejecutados por partes de ejecución (ver partes de ejecución (8) para más información).
Fuente: http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html
Administrar crons de esta manera es más fácil y más escalable desde la perspectiva del sistema, pero no siempre será la mejor solución.
Lo más probable es que esté automatizando esto, y no quiere que se agregue un solo trabajo dos veces. En ese caso, use:
CRON="1 2 3 4 5 /root/bin/backup.sh" cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")
Esto solo funciona si estás usando BASH. No estoy al tanto de la syntax DASH ( sh
) correcta.
Una variante que solo edita crontab si la cadena deseada no se encuentra allí:
CMD="/sbin/modprobe fcpci" JOB="@reboot $CMD" TMPC="mycron" grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
Para una creación / sustitución rápida y sucia de un crontab con un script de BASH, utilicé esta notación:
crontab <
Si está utilizando Vixie Cron, por ejemplo, en la mayoría de las distribuciones de Linux, puede simplemente poner un archivo en /etc/cron.d con el cronjob individual.
Esto solo funciona para la raíz, por supuesto. Si su sistema lo admite, debería ver varios ejemplos allí. (Tenga en cuenta el nombre de usuario incluido en la línea, con la misma syntax que el antiguo / etc / crontab)
Es una triste falacia en cron que no hay forma de manejar esto como un usuario normal, y que muchas implementaciones de cron no tienen manera de manejar esto.
Aquí hay una función bash para agregar un comando a crontab
sin duplicación
function addtocrontab () { local frequency=$1 local command=$2 local job="$frequency $command" cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab - } addtocrontab "0 0 1 * *" "echo hello"
CRON="1 2 3 4 5 /root/bin/backup.sh" cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")
agregue el parámetro -w al comando grep exact, sin el parámetro -w que agrega el cronjob "prueba" causa la eliminación del trabajo cron "testing123"
función de script para agregar / eliminar cronjobs. sin entradas de duplicación:
cronjob_editor () { # usage: cronjob_editor '' ' ' if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi if [[ "$3" == add ]] ;then # add cronjob, no duplication: ( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab - elif [[ "$3" == remove ]] ;then # remove cronjob: ( crontab -l | grep -v -F -w "$2" ) | crontab - fi } cronjob_editor "$1" "$2" "$3"
probado:
$ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add $ crontab -l $ */10 * * * * echo "this is a test" > export_file
No, no hay ninguna opción en crontab para modificar los archivos cron.
Tienes que: tomar el archivo cron actual (crontab -l> newfile), cambiarlo y poner el nuevo archivo en su lugar (crontab newfile).
Si está familiarizado con Perl, puede usar este módulo Config :: Crontab .
LLP, Andrea
función de script para agregar cronjobs. verificar entradas duplicadas, expresiones utilizables *> ”
cronjob_creator () { # usage: cronjob_creator '' ' ' if [[ -z $1 ]] ;then printf " no interval specified\n" elif [[ -z $2 ]] ;then printf " no command specified\n" else CRONIN="/tmp/cti_tmp" crontab -l | grep -vw "$1 $2" > "$CRONIN" echo "$1 $2" >> $CRONIN crontab "$CRONIN" rm $CRONIN fi }
probado:
$ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file' $ crontab -l $ */10 * * * * echo "this is a test" > export_file
fuente: mi cerebro;)
Probablemente pueda cambiar el editor predeterminado a ed y usar un heredoc para editar.
EDITOR=ed export EDITOR crontab -e << EOF > a > * * * * * Myscript > * * * * * AnotherScript > * * * * * MoreScript > . > w > q > EOF
Tenga en cuenta que la tecla > en ese código significa que se presiona la tecla regresar / ingresar para crear una nueva línea.
El a significa APRENDER para que no sobrescriba nada.
El . significa que ha terminado de editar.
El w significa ESCRIBIR los cambios.
El q significa SALIR o salir ed.
puedes verlo
crontab -l
Puede eliminar una entrada también.
EDITOR=ed export EDITOR crontab -e << EOF > /Myscript/ > d > . > w > q > EOF
Eso eliminará la entrada de crontab con Myscript en ella.
La d significa eliminar el patrón dentro de / / .
No lo vuelvas a comprobar
crontab -l
Esta solución funciona dentro de un script demasiado menos que > por supuesto 🙂