Pré-requisitos

Pré-requisitos

Preciso iniciar um script Python todos os dias à meia-noite, e depois de algumas pesquisas na internet, descobri que posso usar o cron para isso. O que estou curioso é que, se eu agendar uma tarefa cron para meia-noite, meu computador será ativado para fazer o trabalho? Ou tenho que ativar o computador usando outra coisa? Estou usando o Ubuntu 16.04.

Responder1

Resposta curta:

Não.

Vocêpodeno entanto, usertcwake. Com rtcwake, você pode ativar o computador, configurá-lo para executar comandos e scripts posteriormente, etc.

As opções incluem acordar em um horário absoluto e em um intervalo de tempo específicoa partir de agora:

-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 

Um exemplo de como o rtcwake pode ser usado está emesta resposta.
Veja também, como sempre,man rtcwake

Responder2

Já existe uma resposta mencionando que você pode usar rtcwakepara esse fim, gostaria de elaborar um pouco mais sobrecomoVocê consegue.

Pré-requisitos

Primeiro, instale rtcwake(do util-linuxpacote) dmidecodee anacron:

sudo apt install util-linux dmidecode anacron

Verifique se o seu computador consegue sair do modo de espera:

sudo rtcwake -m mem -s 30

Isso deve colocar o computador no modo de espera e ativá-lo 30 segundos depois. (Escolhi 30 segundos porque suspender ou hibernar o computador pode levar algum tempo e, se o horário de ativação for anterior ao final do processo de espera, a ativação poderá não funcionar.)

Você pode tentar outros métodos de espera além do mem, diskem particular permite maior economia de energia, mas os sistemas criptografados não poderão retomar sem fornecer manualmente a senha.

Se o seu computador foi ativado com sucesso, verifique se é possível determinar o motivo da ativação:

sudo dmidecode | grep "Wake-up Type"

Se você vir Wake-up Type: APM Timerna saída, está pronto para prosseguir.

Um script personalizado para suspender

Se todos os pré-requisitos forem atendidos, podemos montar um script simples que faça o seguinte:

  • Suspende o computador enquanto define um horário de despertar também.
  • Após o despertar, verifica se o despertar foi programado ou manual.
  • Se a ativação foi agendada, executa os cron jobs e coloca o computador novamente em espera, configurando uma nova ativação.

Aqui está o roteiro:

#! /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 precisa ser executado como root, então recomendo definir o usuário root como proprietário e usá-lo sudopara iniciá-lo. Você pode usar o mecanismo sudoers para possibilitar sua execução sem inserir uma senha, mas não vou entrar em detalhes sobre isso aqui, pois já está descrito em vários guias.

Para tornar esse mecanismo mais fácil de usar, recomendo definir uma tecla de atalho em seu ambiente de área de trabalho. Se você fizer isso, deverá usar um script wrapper que instrua o comando de proteção de tela específico do ambiente de área de trabalho para bloquear a tela antes de executar o script acima com sudo.

Desativando programações normais

Se você quiser que os cron jobs sejamapenasexecutados nos horários programados de ativação e não durante o tempo de atividade ativo do computador, será necessário desativar as programações existentes. No Ubuntu, os cron jobs são organizados em diretórios, mas esses diretórios são executados por jobs de nível inferior em /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 )

Você pode ver que as entradas do crontab que executam trabalhos diários, semanais e mensais só são executadas se o anacron não estiver instalado (com a intenção de que o anacron assuma a tarefa de executá-los de outra forma). Como acabamos de instalar o anacron, o cron não executará mais esses trabalhos automaticamente, mas o anacron sim, que precisamos desabilitar.

O próprio Anacron também é uma tarefa agendada acionada pelo systemd. Para desativá-lo, emita:

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

Em vez de mask, disablepode ser suficiente, encontrei informações conflitantes sobre isso na internet, masmask poderiaajuda a evitar que uma atualização de pacote reative os itens desabilitados.

Feito isso, os cron jobs diários, semanais e mensais não serão executados durante o tempo de atividade normal do computador, apenas pelo script de suspensão fornecido acima e somente após ativações programadas.

informação relacionada