¿Cómo se configura la zona horaria para crontab?

63

He configurado la activación de ACPI para que mi computadora portátil se despierte a una hora determinada cada mañana. La zona horaria para esto es UTC. Quiero configurar mis crontabs también usando UTC para que encajen con la alarma de activación.

¿Cómo lo haces?

He intentado editar /etc/default/cronpara incluir:

TZ="UTC"

Pero no funciona. (También lo he intentado TZ=UTCy TZ="UTC/GMT")

¿Algunas ideas?

alj
fuente
1
hiciste un sudo service cron restartdespués de editar?
Rinzwind
1
No ... pero lo intenté y no hizo la diferencia.
alj
1
posible duplicado de configuración de zona horaria desde la terminal
Isaac Betesh
superuser.com/questions/248841/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

45

Tuve un problema similar en Trusty (14.04). Lo resolvió configurando la zona horaria de la máquina y luego reiniciando el cronservicio

  1. sudo dpkg-reconfigure tzdata - siga las instrucciones para seleccionar Región / País
  2. sudo service cron restart
  3. timedatectl - Verifique su configuración de fecha
onlyjsmith
fuente
1
Después de configurar la zona horaria, puede escribir dateen la línea de comando para confirmar que la fecha es correcta según sus expectativas.
mydoghasworms
¿Reinicié cron, pero todavía usa la zona horaria anterior (UTC)?
Luke Fisk-Lennon el
Esto funcionó a la perfección para mí en 18.10. ~ $ date devuelve la hora correcta. ¡Tengo que amar esas interfaces GUI de colores brillantes de DOS! Gracias.
itsricky
18

No hay una manera fácil de lograr esto. cron usa la hora local. /etc/default/crony otras TZespecificaciones en el crontab solo especifican qué se TZdebe usar para los procesos iniciados por cron, no afecta la hora de inicio.

La mayoría de las soluciones que he visto involucran una utilidad en el medio, por lo que cron comenzaría algo que luego determinaría cuándo patear en UTC (por ejemplo, si sabe que solo le preocupan los cambios de DST, comience 2 horas antes, calcule diferencia horaria, y comience entonces. Eche un vistazo at. Para hacerlo, la gente a menudo usa perlo pythonlenguajes de script similares).

Hay una forma desagradable de hackearlo si quisieras. cron solo lee la información de TZ del sistema al inicio. Por lo tanto, si este es un servidor en ejecución, puede configurar TZ en UTC, reiniciar y, después del inicio, configurarlo en su zona horaria local. También podrías escribir esto.

Como enfoque alternativo, también eche un vistazo a la @rebootsintaxis de cron, que debería ejecutar scripts después del arranque, que suena como lo que podría desear.

Galleta
fuente
14

Hay un archivo que controla la zona horaria del sistema. Acabo de recibir el mismo problema, aquí está la solución:

Si no ha configurado manualmente ninguna zona horaria, la ejecución datedebería mostrar la hora UTC.

  • crear una copia de seguridad

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • eliminar el archivo:

    sudo rm /etc/localtime
    
  • Vivo en Chicago, (es posible que deba cambiar la ruta, usando la ayuda de la tecla de tabulación) así que:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Luego reiniciar. Cuando se inicia el sistema: fecha

  • ahora su zona horaria debería estar allí ahora, y cron lo verá.

FYI: configurar la variable TZ es una solución temporal, y puede actuar como una "máscara" a veces.

Vinicius Egerland
fuente
1
+1 para una solución compatible con CentOS (y EC2 Amazon Linux). Un reinicio completo puede ser una buena idea, pero para mí datetrabajé sin reiniciar, y el reinicio del sistema de barras sudo service crond restartfue suficiente para arreglar mis tiempos de trabajo cron.
2016
+1 Gracias, está funcionando.
Jim
13

A partir de marzo de 2017, descubrí que crond admite la variable CRON_TZ en cada crontab.

La variable CRON_TZ especifica la zona horaria específica para la tabla cron. El usuario debe ingresar una hora de acuerdo con la zona horaria especificada en la tabla. El tiempo utilizado para escribir en un archivo de registro se toma de la zona horaria local, donde se ejecuta el demonio.

- cita de la página de manual de crontab (5)

Esto me permitió especificar el tiempo para ejecutar cada cronjob en hora local, que representaba automáticamente el horario de verano, mientras el servidor permanecía en UTC.

Keith Shaw
fuente
También encontré útil este enlace: serverfault.com/questions/848829/… . Para encontrar la opción de zona horaria que necesitaba, ingresé ls /usr/share/zoneinfo/Americapara ver las opciones.
cheevahagadog
7

OK, me tomé un tiempo y descubrí cómo hacer esto en Ubuntu Natty, y así es como lo hice funcionar. Puede haber una forma más elegante, pero de esta manera funciona.

Primero, necesitamos envolver el ejecutable cron en un shell que establece la variable TZ. Así es cómo:

cd /usr/sbin
mv cron cron.real

Luego, cree un nuevo archivo / usr / sbin / cron. Usé vim, pero puedes usar el editor que quieras, solo haz que el archivo se vea así:

#!/bin/bash
export TZ=UTC
/usr/sbin/cron.real

Haga que el nuevo archivo cron sea ejecutable:

chmod ugo+rx cron

Ahora, reinicie el demonio cron:

service cron restart

Sus trabajos cron ahora se ejecutarán en un horario basado en UTC - SIN EMBARGO, aunque el tiempo en que se ejecuten será UTC, cuando se ejecuten tendrán la zona horaria establecida en lo que sea definido para el sistema. Para cambiar eso, ponga esto en su crontab antes de cualquier comando:

TZ=UTC

Entonces su crontab se verá así:

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
TZ=UTC
00 19 * * * date > /tmp/date.log
James Parks
fuente
1
¿Cuál es el punto de configurar TZ = UTC en dos lugares? ¿No puedes simplemente ponerlo en el archivo crontab?
Phương Nguyễn
No. Poner TZ = UTC en el archivo crontab solo lo establece para los trabajos cron, no para el cron en sí. No afecta el momento de la ejecución del trabajo.
Mark Reed
5
  1. Ver /etc/default/cron. Puede configurar TZaquí para -todos- crontabs y debería ser TZ=UTCiirc. Entonces su método debería haber funcionado.

  2. Echa un vistazo a fcron . Puede configurar crontabs individuales en diferentes zonas horarias:

    timezone-name 'time zone of the system'

    Ejecute el trabajo en la zona horaria dada. timezone-name es una cadena que es válida para la variable de entorno TZ: consulte la documentación de su sistema para obtener más detalles. Por ejemplo, "Europa / París" es válido en un sistema Linux. Esta opción maneja los cambios de horario de verano correctamente. La variable de entorno TZ se establece en el valor de la zona horaria cuando se ejecuta un trabajo que define esta opción.

    Tenga en cuenta que si da un argumento erróneo de nombre de zona horaria, se ignorará SILENCIOSAMENTE y el trabajo se ejecutará en la zona horaria del sistema.

Rinzwind
fuente
Bueno, lo comprobé y el crontab solo funciona cuando configuro la hora de activación como la hora local. Establecer la hora en UTC simplemente no funciona.
alj
bueno, 4 años después
eché
¿Un voto negativo después de 4 años? Sí, esto no es válido ahora, pero no fue en el pasado. Por otra parte, ya nadie es el usuario 11.04, espero.
Rinzwind
3
Si esta respuesta no es válida, probablemente debería eliminarla; no tiene sentido mantener deliberadamente información errónea en StackExchange. Que solía ser sobre el tema y / o correcto es prácticamente irrelevante para cualquiera que visite esta página en busca de información correcta.
Quuxplusone
4

Por favor vea mi próximo post para una solución específica de Ubuntu

Sé que este es un foro de Ubuntu, pero creo que la respuesta será muy similar a cómo lo harías en un sistema Red Hat. No tengo un sistema Ubuntu a mano para probar esto, pero lo probé en Red Hat.

Todo lo que necesita hacer es agregar una línea a su script de inicio cron daemon. Establezca y exporte la variable de entorno TZ, así:

export TZ=UTC

Luego reinicia tu cron daemon. Asegúrese de poner esta exportación en el script de inicio de cron daemon DESPUÉS de cualquier otra configuración y fuente de variables: creo que esta puede ser la razón por la cual la edición original del póster del /etc/default/cronscript no funcionó para él. Tal vez lo configuró, pero luego fue restablecido por otra cosa más abajo en el guión.

Tenga en cuenta que esto solo afectará al demonio cron en sí, y no a los trabajos que ejecuta a través de cron, por lo que si desea que un trabajo cron use UTC como su zona horaria, también deberá configurarlo en el trabajo.

Probablemente no pueda copiar este literal y hacer que funcione en un cuadro de Ubuntu, pero aquí está el script de inicio que usé para probar esto en Red Hat. Encontrará la exportación justo antes de la start()función:

#!/bin/sh
#
# crond          Start/Stop the cron clock daemon.
#
# chkconfig: 2345 90 60
# description: cron is a standard UNIX program that runs user-specified \
#              programs at periodic scheduled times. vixie cron adds a \
#              number of features to the basic UNIX cron, including better \
#              security and more powerful configuration options.

### BEGIN INIT INFO
# Provides: crond crontab
# Required-Start: $local_fs $syslog
# Required-Stop: $local_fs $syslog
# Default-Start:  2345
# Default-Stop: 90
# Short-Description: run cron daemon
# Description: cron is a standard UNIX program that runs user-specified 
#              programs at periodic scheduled times. vixie cron adds a 
#              number of features to the basic UNIX cron, including better 
#              security and more powerful configuration options.
### END INIT INFO

[ -f /etc/sysconfig/crond ] || { 
    [ "$1" = "status" ] && exit 4 || exit 6 
}

RETVAL=0
prog="crond"
exec=/usr/sbin/crond
lockfile=/var/lock/subsys/crond
config=/etc/sysconfig/crond

# Source function library.
. /etc/rc.d/init.d/functions

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

export TZ=UTC
start() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    [ -x $exec ] || exit 5
    [ -f $config ] || exit 6
    echo -n $"Starting $prog: "
    daemon $prog $CRONDARGS
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
}

stop() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    echo -n $"Stopping $prog: "
    if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec
        RETVAL=3
    else
        failure $"Stopping $prog"
    fi
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
}

restart() {
    stop
    start
}

reload() {
    echo -n $"Reloading $prog: "
    if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec -HUP
    else
        failure $"Reloading $prog"
    fi
    retval=$?
    echo
}

force_reload() {
    # new configuration takes effect after restart
    restart
}

rh_status() {
    # run checks to determine if the service is running or use generic status
    status -p /var/run/crond.pid $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}


case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?
James Parks
fuente
0

Acabo de descubrir esto en Ubuntu 14/16. Funcionó perfectamente para mí.

Pasos (sudo implicado):

cat /etc/timezone
rm -fv /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Kolkata /etc/localtime
apt install -y --reinstall tzdata
/etc/init.d/rsyslog restart
tail -f /var/log/syslog
cat /etc/timezone
Varun Chandak
fuente
0

¿Qué pasa con la evaluación del tiempo utc en un script de shell? Programe el script de shell para que se ejecute cada hora. En la parte superior del script, obtenga la hora UTC del comando date. Si no es la hora UTC que desea, salga.

Este script se cerrará si no es la 1 a.m. utc.

#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
 exit 0
fi
user754068
fuente
0

Puede establecer la variable de entorno CRON_TZ Si el trabajo cron se ejecuta en un servidor remoto, probablemente debería notar que el shell utilizado por crontab es sh . Puede verificar dos veces en / etc / crontab .

PT Huynh
fuente