如何在執行 60 分鐘後關閉 Linux 伺服器?
我有一台伺服器,出於安全原因,它通常會關閉。當我想處理它時,我打開它,執行我的任務,然後再次關閉它。我的任務通常不超過 15 分鐘。我想實現一種機制,在 60 分鐘後自動關閉它。
我已經研究過如何使用 cron 執行此操作,但我認為這不是正確的方法,因為 cron 沒有考慮伺服器上次打開的時間。我只能設置週期性模式,但他們沒有考慮到這些數據。
我怎麼能做這個實現?
有幾個選項。
- 直接提供時間
shutdown -P
:shutdown -P +60
請注意,
shutdown
手冊頁還指出:如果使用 time 參數,則在系統關閉前 5 分鐘創建 /run/nologin 文件以確保不允許進一步登錄。
- 使用
at
命令。- 創建一個在啟動時執行的systemd 單元文件或初始化腳本
shutdown -P 60
。- 啟動後使用 cron
@reboot
執行命令。添加到(根)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 會話
ClientAliveInterval
和ClientAliveCountMax
. 如果您沒有 SSH,但有本地終端會話,則另一種方法是使用命令返回的終端空閒時間w
。