Rhel

這些用於關閉 Linux 伺服器的命令有什麼區別?

  • August 19, 2018

閱讀“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 來說是不正確的。這是haltvan Smoorenburg“系統 5”init實用程序的命令。
  • /sbin/halt忽略作為符號連結的語句/sbin/reboot;systemd 並非如此。根本沒有單獨reboot的程序。
  • 忽略使用命令行參數haltreboot呼叫程序的語句;shutdownsystemd 也不是這樣。根本沒有單獨shutdown的程序。

每個系統管理工具集都有這些實用程序的版本。systemd、upstart、nosh、van Smoorenburginit和 BSDinit都有自己的halt,poweroff等等。在每一個上,它們的機制都略有不同。他們的手冊頁也是如此。

在 systemd 工具集中haltpoweroffreboottelinitshutdown都是指向. 它們都是向後兼容的墊片,只是呼叫 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

systemctlsystemd-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選項與對、haltreboot命令的選項poweroff相同。這使得嘗試直接呼叫。通常它只是試圖隔離目標。--force --force``systemctl halt``systemctl reboot``systemctl poweroff``systemctl``reboot()
  • telinit不一樣init。它們是 systemd 世界中的不同程序,後者是程序的另一個名稱systemd,而不是systemctl程序的名稱。該systemd程序根本不一定與任何 van Smoorenburg 兼容性編譯,並且在某些 systemd 作業系統上抱怨如果嘗試呼叫會被錯誤地呼叫。init *N*

進一步閱讀

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