cómo establecer cronjob durante 2 días?

Nos gustaría utilizar un cronjob para crear una copia de seguridad de la base de datos.

La copia de seguridad debería ocurrir cada dos días. ¿Se puede usar la siguiente entrada cron?

0 0 2 * * * backup-command 

Si esto no funciona, dígame el comando correcto para configurar el cron por 2 días.

Desde aquí :

Cron también admite valores ‘paso’.

Un valor de */2 en el campo dom significa que el comando se ejecuta cada dos días y del mismo modo, */5 en el campo horas significa que el comando se ejecuta cada 5 horas. p.ej

 * 12 10-16/2 * * root backup.sh 

es lo mismo que:

 * 12 10,12,14,16 * * root backup.sh 

Entonces creo que quieres 0 0 */2 * * .

Lo que tienes ( 0 0 2 * * ) ejecutará el comando el 2 del mes a la medianoche, todos los meses.

ps Pareces tener un asterisco extra en tu respuesta. El formato debe ser:

 minute hour dom month dow user cmd 

Entonces su asterisco adicional estaría en el campo de user . Es eso intencional?

Descargo de responsabilidad: esta es una copia de mi respuesta deleted aquí . Creo que esta pregunta es más canónica , y mi respuesta se ajusta mejor aquí.

Hay dos formas en que esta pregunta puede ser interpretada.

  • Me gustaría progtwigr un trabajo cron cada segundo día del mes.
  • Me gustaría progtwigr un trabajo cron cada dos días.

Estos son dos casos completamente diferentes debido a la cantidad de días que hay en un mes.

Me gustaría progtwigr un cronjob cada segundo día del mes.

Para esto, usamos la combinación de definir un rango y un valor de paso:

man 5 crontab : los valores de los pasos se pueden usar junto con los rangos. Seguir un rango con / especifica saltos del valor del número a través del rango. Por ejemplo, 0-23/2 se puede usar en el campo ‘horas’ para especificar la ejecución del comando cada dos horas (la alternativa en el estándar V7 es 0,2,4,6,8,10,12,14,16,18,20,22 ). Los valores de paso también están permitidos después de un asterisco, por lo que si especifica que un trabajo se ejecute cada dos horas, puede usar */2 .

Vea los siguientes ejemplos:

 # Example of job definition: # .-------------------- minute (0 - 59) # | .----------------- hour (0 - 23) # | | .-------------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) # | | | | | # * * * * * command to be executed 0 0 */2 * * command1 0 0 2-31/2 * * command2 * * */2 * * command3 
  • command1 se ejecutará a las 00:00 en cada día impar (rango predeterminado con el paso 2, es decir, 1,3,5,7, …, 31)
  • command2 se ejecutará a las 00:00 en cada día par (es decir, 2,4,6,8, …, 30)
  • command3 es un error que a menudo se comete. Esto se ejecutará en cada minuto de cada día impar.

Nota: Debe entenderse que en este método, command1 se ejecutará el 31 de enero y el 1 de febrero (2 días consecutivos)

Nota: Debe entenderse que en este método, command2 omitirá tanto el 31 de enero como el 1 de febrero y se ejecutará solo 3 días después.

Me gustaría progtwigr un cronjob cada dos días (a partir del día X)

Aquí se pone más interesante. Las notas anteriores ya demostraron el problema con meses que tienen un número impar de días.

La forma más rápida de pensar sería evaluar el día del año:

 % date -d "2018-01-31" '+%j' 031 % date -d "2018-02-01" '+%j' 032 

y podría investigar fácilmente si se trata de un número par o impar. Sin embargo, al hacer esto, nuevamente tiene un problema el 31 de diciembre y el 1 de enero en un año común (365 días, los años bisiestos tienen 366 días). Esto se puede resolver cuando tienes un contador continuo de un día determinado. Ingrese la marca de tiempo de UNIX, el total de segundos desde 1970-01-01 00:00:00 UTC .

 % date -d "2018-12-31" '+%s %j' 1546214400 365 % date -d "2019-01-01" '+%s %j' 1546300800 001 % date -d "2019-12-31" '+%s %j' 1577750400 365 % date -d "2020-01-01" '+%s %j' 1577836800 001 

Para que cronjob ejecute el command4 solo cada segundo día a las 00:00 y command5 cada tres días a las 00:00 partir de “2018-03-14”, el crontab se vería así:

 # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) # | | | | | # * * * * * command to be executed 0 0 * * * daytestcmd 2 && command4 0 0 * * * daytestcmd 3 20180314 && command5 

con daytestcmd definido como

 #!/usr/bin/env bash # get start time in seconds start=$(date -d "${2:-@0}" '+%s') # get current time in seconds now=$(date '+%s') # get the amount of days (86400 seconds per day) days=$(( (now-start) /86400 )) # set the modulo modulo=$1 # do the test (( days >= 0 )) && (( days % modulo == 0)) 

Observación: la hora de UNIX se da en UTC. Si su cron se ejecuta en una zona horaria diferente que está influenciada por el horario de verano, se recomienda no ejecutar el comando entre las 2 y las 3 en punto. Esto podría omitir el comando o ejecutar el comando dos veces (dependiendo de si el tiempo salta hacia adelante o hacia atrás)

Observación: el tiempo UNIX no está influenciado por segundos intercalares

Si quieres usar el comando crontab -e , prueba este patrón de tiempo:

 0 1 */2 * * command_to_execute 

O bien, puede probar SetCronJob para una solución basada en web. Puede crear trabajos cron fácilmente cada 2 días con la segunda fila de creación.