先決條件

先決條件

我需要每天午夜啟動一個Python腳本,經過在互聯網上的一些搜索,我發現我可以使用cron來實現這一點。我很好奇的是,如果我在午夜安排 cron 任務,它會喚醒我的電腦來完成這項工作嗎?或者我必須使用其他東西喚醒電腦嗎?我使用的是 Ubuntu 16.04。

答案1

簡短回答:

不。

然而使用即時喚醒。使用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 )

您可以看到,僅在未安裝 anacron 的情況下才會執行每日、每周和每月運行的 crontab 條目(目的是讓 anacron 接管執行它們的任務)。由於我們剛剛安裝了 anacron,cron 不會再自動執行這些作業,但 anacron 會,我們需要停用它。

Anacron本身也是一個由systemd觸發的計劃任務。要禁用它,請發出:

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

我在互聯網上發現了有關此問題的相互矛盾的信息,而不是,mask可能就足夠了,但是disablemask 可能幫助防止套件升級重新啟用已停用的項目。

完成此操作後,每日、每周和每月的 cron 作業將不會在電腦的正常運行時間內執行,只能透過上面提供的掛起腳本執行,並且僅在計劃的喚醒之後執行。

相關內容