Cron

如何在執行 60 分鐘後關閉 Linux 伺服器?

  • June 27, 2020

我有一台伺服器,出於安全原因,它通常會關閉。當我想處理它時,我打開它,執行我的任務,然後再次關閉它。我的任務通常不超過 15 分鐘。我想實現一種機制,在 60 分鐘後自動關閉它。

我已經研究過如何使用 cron 執行此操作,但我認為這不是正確的方法,因為 cron 沒有考慮伺服器上次打開的時間。我只能設置週期性模式,但他們沒有考慮到這些數據。

我怎麼能做這個實現?

有幾個選項。

  • 直接提供時間shutdown -P
shutdown -P +60

請注意,shutdown 手冊頁還指出:

如果使用 time 參數,則在系統關閉前 5 分鐘創建 /run/nologin 文件以確保不允許進一步登錄。

添加到(根)crontab:

@reboot shutdown -P +60

對於最後兩種方法,您也可以使用sleep 3600 && shutdown -P now而不是使用 time 參數shutdown來延遲關機 60 分鐘。這種方式可以在發出關機前的最後一刻登錄。

這看起來像一個XY 問題

我的任務通常不超過 15 分鐘。我想實現一種機制,在 60 分鐘後自動關閉它。

如果您在 60 分鐘後關閉,您可能會遇到可能遇到特別複雜的問題並且需要更多時間的風險。以前的許多解決方案都不容易延遲關機。

如果任務不是互動式任務,而是從另一台機器自動觸發的腳本任務,@sdkks 提供了一個很好的解決方案;你真的應該讓機器在腳本及其所有任務完成後立即執行 poweroff。

但是,如果您的任務是互動式任務,我建議改為進行空閒檢測。

如果您在 GUI (X11) 中執行任務,則可以使用此處描述的方法檢測空閒 GUI 會話:Run a command when system is idle and when is active again

如果您通過終端執行任務,則可以使用該who命令檢測登錄使用者。who您可以設置一個 cronjob,如果返回空結果則關閉機器。請注意,這將是一種相當保守的方法;如果您讓控制台保持連接狀態,它不會關閉系統,而是處於空閒狀態。

如果您想更積極一點並斷開空閒的終端會話,您可以將之前的方法與自動斷開空閒的 SSH 會話 ClientAliveIntervalClientAliveCountMax. 如果您沒有 SSH,但有本地終端會話,則另一種方法是使用命令返回的終端空閒時間w

引用自:https://unix.stackexchange.com/questions/472718