Requisitos previos

Requisitos previos

Necesito iniciar un script de Python todos los días a medianoche y, después de buscar un poco en Internet, descubrí que puedo usar cron para eso. Lo que tengo curiosidad es que si programo una tarea cron para medianoche, ¿activará mi computadora para hacer el trabajo? ¿O tengo que reactivar la computadora usando otra cosa? Estoy usando Ubuntu 16.04.

Respuesta1

Respuesta corta:

No.

podersin embargo usodespertar. Con rtcwake, puede reactivar la computadora, configurarla para ejecutar comandos y scripts posteriormente, etc.

Las opciones incluyen tanto despertarse a una hora absoluta como despertarse a una hora específica.desde ahora:

-s seconds | --seconds seconds
    Sets the wakeup time to seconds in future from now. 
-t time_t | --time time_t
    Sets the wakeup time to the absolute time time_t. time_t is the time in seconds since 1970-01-01, 00:00 UTC. Use the 

Un ejemplo de cómo se puede utilizar rtcwake está enesta respuesta.
Véase también, como siempre,man rtcwake

Respuesta2

Ya hay una respuesta que menciona que puedes usar rtcwakepara este propósito, me gustaría explicar un poco más sobrecómopuedes hacerlo.

Requisitos previos

Primero, instale rtcwake(desde el util-linuxpaquete) dmidecodey anacron:

sudo apt install util-linux dmidecode anacron

Compruebe si su computadora puede reactivarse desde el modo de espera:

sudo rtcwake -m mem -s 30

Esto debería poner su computadora en modo de espera y reactivarla 30 segundos después. (Elegí 30 segundos porque suspender o hibernar su computadora puede llevar algún tiempo, y si la hora de reactivación termina siendo anterior al final del proceso de espera, es posible que la reactivación no funcione).

Puede probar otros métodos de espera además de mem, disken particular, permite un mayor ahorro de energía, pero los sistemas cifrados no podrán reanudarse sin proporcionar la contraseña manualmente.

Si su computadora se despertó exitosamente, verifique si es posible determinar el motivo de la reactivación:

sudo dmidecode | grep "Wake-up Type"

Si lo ve Wake-up Type: APM Timeren el resultado, estará listo para comenzar.

Un script personalizado para suspender

Si se cumplen todos los requisitos previos, podemos crear un script simple que haga lo siguiente:

  • Suspende la computadora mientras configura una hora para despertarse también.
  • Después del despertar, verifica si el despertar fue programado o manual.
  • Si se programó el despertar, ejecuta los trabajos cron y vuelve a poner la computadora en modo de espera, configurando un nuevo despertar.

Aquí está el guión:

#! /bin/bash
# https://askubuntu.com/a/1323317
while true
do
  wake_at=22:05 # Set to whenever you want the cron jobs to run each day
  wake_ts="$(date -d "$wake_at" +%s)"
  now_ts="$(date +%s)"
  if [ "$wake_ts" -lt "$now_ts" ]
  then
    wake_ts="$(date -d "tomorrow $wake_at" +%s)"
  fi
  rtcwake -m mem -t "$wake_ts"

  # After wake-up
  #
  # Without this sleep, the current time would still seem to be the instant when
  # the suspend happened, confusing man and machine alike.
  sleep 1
  if dmidecode | grep -q "Wake-up Type: APM Timer"
  then
    # We trigger anacron manually. To prevent cron jobs from running during
    # active uptime, its systemd triggers need to be disabled.
    /usr/sbin/anacron -nd
  else
    exit 0
  fi
done

Este script debe ejecutarse como root, por lo que recomiendo configurar el usuario root como propietario y usarlo sudopara iniciarlo. Puedes usar el mecanismo sudoers para que sea posible ejecutarlo sin ingresar una contraseña, pero no daré más detalles aquí porque ya se describe en muchas guías.

Para que este mecanismo sea más fácil de usar, recomiendo configurar una tecla de acceso rápido en su entorno de escritorio. Si hace eso, debe usar un script contenedor que le indique al comando de protector de pantalla específico del entorno de escritorio que bloquee la pantalla antes de ejecutar el script anterior con sudo.

Desactivar horarios normales

Si desea que los trabajos cronsolose ejecutan a las horas de activación programadas y no durante el tiempo de actividad activa de la computadora, es necesario desactivar sus programaciones existentes. En Ubuntu, los trabajos cron están organizados en directorios, pero esos directorios son ejecutados por trabajos de nivel inferior en /etc/crontab:

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Puede ver que las entradas de crontab que ejecutan trabajos diarios, semanales y mensuales solo se ejecutan si anacron no está instalado (con la intención de que anacron asuma la tarea de ejecutarlas en caso contrario). Como acabamos de instalar anacron, cron ya no ejecutará estos trabajos automáticamente, pero anacron sí lo hará, lo cual debemos desactivar.

El propio Anacron también es una tarea programada activada por systemd. Para desactivarlo, emita:

sudo systemctl mask --now anacron.service
sudo systemctl mask --now anacron.timer

En lugar de mask, disablepuede ser suficiente, encontré información contradictoria sobre esto en Internet, peromask puedeayuda para evitar que una actualización de paquete vuelva a habilitar los elementos deshabilitados.

Una vez hecho esto, los trabajos cron diarios, semanales y mensuales no se ejecutarán durante el tiempo de actividad normal de la computadora, solo mediante el script de suspensión proporcionado anteriormente y solo después de las reactivaciones programadas.

información relacionada