前提条件

前提条件

毎日深夜に Python スクリプトを起動する必要があり、インターネットで検索したところ、cron を使用できることがわかりました。気になるのは、深夜に cron タスクをスケジュールすると、そのタスクを実行するためにコンピューターが起動するかどうかです。それとも、何か他の方法でコンピューターを起動する必要がありますか。Ubuntu 16.04 を使用しています。

答え1

短い答え:

いいえ。

あなたできるただし使用rtcwakeを使用するとrtcwake、コンピューターを起動し、その後にコマンドやスクリプトを実行するように設定することができます。

オプションには、絶対時間に起きることと、特定の時間範囲に起きることの両方が含まれます。今から:

-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 

rtcwakeの使用方法の例は、この答え
いつものように、man rtcwake

答え2

この目的に使用できると言及している回答はすでにありますがrtcwake、もう少し詳しく説明したいと思います。どうやってあなたならできるよ。

前提条件

まず、rtcwake(パッケージからutil-linux)インストールし、次の操作を実行しdmidecodeますanacron

sudo apt install util-linux dmidecode anacron

コンピュータがスタンバイ モードから復帰できるかどうかを確認します。

sudo rtcwake -m mem -s 30

これにより、コンピューターがスタンバイ モードになり、30 秒後に起動します。(コンピューターのサスペンドまたは休止状態には時間がかかる場合があり、起動時間がスタンバイ プロセスの終了時間よりも早くなると、起動が機能しない可能性があるため、30 秒を選択しました。)

以外のスタンバイ方法を試すこともできますmemdisk特に、 では大幅な省電力が可能になりますが、暗号化されたシステムでは手動でパスワードを入力しないと再開できません。

コンピュータが正常に起動した場合は、起動の理由を特定できるかどうかを確認します。

sudo dmidecode | grep "Wake-up Type"

出力に表示されればWake-up Type: APM Timer、準備完了です。

一時停止用のカスタムスクリプト

すべての前提条件が満たされている場合は、次の操作を実行する簡単なスクリプトを作成できます。

  • ウェイクアップ時間を設定しながらコンピュータをサスペンドします。
  • ウェイクアップ後、ウェイクアップがスケジュールされたものか手動のものかを確認します。
  • ウェイクアップがスケジュールされている場合は、cron ジョブを実行し、コンピューターをスタンバイ状態に戻し、新しいウェイクアップを設定します。

スクリプトは次のとおりです。

#! /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

このスクリプトは root として実行する必要があるため、所有者として root ユーザーを設定し、sudo起動に使用することをお勧めします。パスワードを入力せずに実行できるようにするには、sudoers メカニズムを使用できますが、多くのガイドで既に説明されているため、ここでは詳しく説明しません。

このメカニズムを使いやすくするために、デスクトップ環境にホットキーを設定することをお勧めします。その場合、上記のスクリプトを実行する前に、デスクトップ環境固有のスクリーンセーバーコマンドに画面をロックするように指示するラッパースクリプトを使用する必要がありますsudo

通常のスケジュールを無効にする

cronジョブでのみコンピュータのアクティブなアップタイムではなく、スケジュールされたウェイクアップ時間に実行されるようにするには、既存のスケジュールを無効にする必要があります。Ubuntu では、cron ジョブはディレクトリに整理されていますが、それらのディレクトリは次の下位レベルのジョブによって実行されます/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 )

毎日、毎週、毎月のジョブを実行する crontab エントリは、anacron がインストールされていない場合にのみ実行されることがわかります (そうでない場合は、anacron がそれらの実行タスクを引き継ぐことを意図しています)。anacron をインストールしたばかりなので、cron はこれらのジョブを自動的に実行しなくなりますが、anacron は実行します。これを無効にする必要があります。

Anacron 自体も systemd によってトリガーされるスケジュールされたタスクです。これを無効にするには、次のコマンドを実行します。

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

の代わりにmaskdisableインターネット上でこれに関する矛盾した情報を見つけましたが、mask 5月パッケージのアップグレードによって無効化された項目が再度有効化されるのを防ぎます。

これが完了すると、毎日、毎週、毎月の cron ジョブは、コンピューターの通常の稼働時間中には実行されなくなり、上記の停止スクリプトによってのみ、スケジュールされたウェイクアップ後にのみ実行されるようになります。

関連情報