這些用於關閉 Linux 伺服器的命令有什麼區別?
閱讀“Halt 和 Shutdown 命令有什麼區別?” ,我通常知道命令 shutdown 的作用,不管有沒有 -h/-r 選項。
“halt”命令執行系統斷電到系統的執行級別0。
“shutdown”命令在不使用 -h 或 -r 命令的情況下將系統關閉到執行級別 1。
命令“poweroff”會進入執行級別 0 還是 1 呢?這是這三個命令之間唯一的主要區別嗎?
現在,systemd 的答案。
根據您問題上的標籤,您正在使用 Red Hat Enterprise Linux。從版本 7 開始,它使用了 systemd。對於 systemd 世界,其他答案都不正確。您的問題中的某些假設甚至也不是。
- 忘記執行級別;它們存在,但僅作為兼容性墊片。systemd 文件指出該概念已“過時”。如果您開始在 systemd 作業系統上學習這些東西,請不要從那裡開始。
- 忘記marcelm引用的手冊頁;它根本不是來自正確的工具集,而是對另一個工具集命令的描述,對於 systemd 來說是不正確的。這是
halt
van Smoorenburg“系統 5”init
實用程序的命令。/sbin/halt
忽略作為符號連結的語句/sbin/reboot
;systemd 並非如此。根本沒有單獨reboot
的程序。- 忽略使用命令行參數
halt
或reboot
呼叫程序的語句;shutdown
systemd 也不是這樣。根本沒有單獨shutdown
的程序。每個系統管理工具集都有這些實用程序的版本。systemd、upstart、nosh、van Smoorenburg
init
和 BSDinit
都有自己的halt
,poweroff
等等。在每一個上,它們的機制都略有不同。他們的手冊頁也是如此。在 systemd 工具集中
halt
,poweroff
、reboot
、telinit
和shutdown
都是指向. 它們都是向後兼容的墊片,只是呼叫 systemd 的主要命令行界面的簡寫:. 它們都映射到(實際上是)同一個程序。(按照慣例,shell 會告訴它呼叫它的名稱。)/bin/systemctl``systemctl
目標,而不是執行級別
這些命令中的大多數是告訴 systemd 的簡寫,使用
systemctl
, 來隔離特定的目標。隔離在systemctl
手冊頁 (qv) 中進行了說明,但出於此答案的目的,可以將其視為啟動目標並停止任何其他目標。systemd 中使用的標準目標在systemd.special
(8) 手冊頁中列出。systemd 工具集中 (7) 手冊頁上的圖表
bootup
,尤其是最後一個,顯示了與此處相關的三個“最終”目標:
halt.target
— 一旦系統達到完全隔離此目標的狀態,它就會呼叫reboot(RB_HALT_SYSTEM)
系統呼叫。核心將試圖進入一個 ROM 監控程序,或者乾脆停止 CPU(使用任何適合這樣做的機制)。reboot.target
— 一旦系統達到完全隔離此目標的狀態,它就會呼叫reboot(RB_AUTOBOOT)
系統呼叫(或具有神奇命令行的等效項)。核心將嘗試觸發重新啟動。poweroff.target
— 一旦系統達到完全隔離此目標的狀態,它就會呼叫reboot(RB_POWER_OFF)
系統呼叫。如果可能,核心將嘗試從系統中移除電源。這些是您應該考慮的最終系統狀態,而不是執行級別。從圖中註意到,systemd 目標系統本身編碼的東西在其他系統中是隱式而不是顯式的:例如這些最終目標中的每一個都包含
shutdown.target
目標的概念,因此描述了必須在關閉之前停止的服務讓他們與目標發生衝突。shutdown.target
systemctl
systemd-logind
當呼叫使用者不是超級使用者時嘗試發送請求。它還將延遲關閉傳遞給systemd-shutdownd
. 一些速記會觸發wall
通知。除了那些複雜性之外,假設您目前是超級使用者並且沒有請求計劃的操作,這會使這個答案延長數倍:
systemctl isolate halt.target
有速記:
shutdown -H now
systemctl halt
- 樸素的
halt
systemctl isolate reboot.target
有速記:
shutdown -r now
telinit 6
systemctl reboot
- 樸素的
reboot
systemctl isolate poweroff.target
有速記:
shutdown -P now
telinit 0
shutdown now
systemctl poweroff
- 樸素的
poweroff
systemctl isolate rescue.target
有速記:
telinit 1
systemctl rescue
systemctl isolate multi-user.target
有速記:
telinit 2
telinit 3
telinit 4
systemctl isolate graphical.target
有簡寫:
telinit 5
在解析了各種不同的命令行語法之後,這些最終都在
systemctl
程序內部的相同程式碼路徑中結束。筆記:
- 無選項的傳統行為是
shutdown now
切換到單使用者模式。這不是 systemd 的情況。rescue.target
— 單使用者模式在 systemd 中被重命名為救援模式shutdown
— 無法使用該命令訪問。telinit
確實完全忽略了手冊頁描述的文件系統中的所有這些和符號連結。上述映射被硬連線到程序中,在一個表中。runlevel*N*.target``default.target``systemctl
- systemd 沒有目前執行級別的概念。這些命令的操作不以任何“如果您處於執行級別N ”為條件。
- 、和命令的
--force
選項與對、halt
和reboot
命令的選項poweroff
相同。這使得嘗試直接呼叫。通常它只是試圖隔離目標。--force --force``systemctl halt``systemctl reboot``systemctl poweroff``systemctl``reboot()
telinit
不一樣init
。它們是 systemd 世界中的不同程序,後者是程序的另一個名稱systemd
,而不是systemctl
程序的名稱。該systemd
程序根本不一定與任何 van Smoorenburg 兼容性編譯,並且在某些 systemd 作業系統上抱怨如果嘗試呼叫會被錯誤地呼叫。init *N*
進一步閱讀
- 在不切斷電源的情況下停止系統有什麼好的理由嗎?
- 為什麼
init 0
在 Arch 安裝時會導致“Excess Arguments”?- 斯蒂芬·韋德利 (2014)。 “8. 使用 systemd 管理服務” 紅帽企業 Linux 7 系統管理員指南。紅色的帽子。
- Lennart Poettering (2013-10-07)。
systemctl
. systemd 手冊頁。免費桌面.org。- Lennart Poettering (2013-10-07)。
systemd.special
. systemd 手冊頁。免費桌面.org。- Lennart Poettering (2013-10-07)。
bootup
. systemd 手冊頁。免費桌面.org。- 喬納森·德博因·波拉德 (2018)。
init
. 小吃指南。軟體。