1. 程式人生 > >【轉載】關於shutdown halt reboot poweroff init 0幾種關機和重啟命令的理解

【轉載】關於shutdown halt reboot poweroff init 0幾種關機和重啟命令的理解

shutdown 先執行關閉程序,寫入磁碟等一系列操作後 init 0關機 init 6 重啟

halt 沒有在init 0 ,init 6執行級別時,呼叫shutdown(相當於shutdown -h now)

reboot 沒有在init 0 ,init 6執行級別時,呼叫shutdown(相當於shutdown -r now)

poweroff 直接指向 halt -p 相當於halt

init 0命令用於立即將系統執行級別切換為0,即關機(難道不關閉程序,不寫入磁碟??)

linux下一些常用的關機/重啟命令有shutdownhaltreboot、及init

它們都可以達到重啟系統的目的,但每個命令的內部工作過程是不同的,通過本文的介紹,希望你可以更加靈活的運用各種關機命令。

1.shutdownshutdown命令安全地將系統關機。有些使用者會使用直接斷掉電源的方式來關閉linux,這是十分危險的。因為linuxwindows不同,其後臺執行著許多程序,所以強制關機可能會導致程序的資料丟失,使系統處於不穩定的狀態,甚至在有的系統中會損壞硬體裝置。而在系統關機前使用shutdown命令,系統管理員會通知所有登入的使用者系統將要關閉。並且login指令會被凍結,即新的使用者不能再登入。直接關機或者延遲一定的時間才關機都是可能的,還可能重啟。這是由所有程序〔process〕都會收到系統所送達的訊號〔signal〕決定的。這讓像vi之類的程式有時間儲存目前正在編輯的文件,而像處理郵件〔
mail〕和新聞〔news〕的程式則可以正常地離開等等。shutdown執行它的工作是送訊號〔signal〕給init程式,要求它改變runlevelRunlevel 0被用來停機〔halt〕,runlevel 6是用來重新啟用〔reboot〕系統,而runlevel 1則是被用來讓系統進入管理工作可以進行的狀態;這是預設的,假定沒有-h也沒有-r引數給shutdown。要想了解在停機〔halt〕或者重新開機〔reboot〕過程中做了哪些動作,你可以在這個檔案/etc/inittab裡看到這些runlevels相關的資料。shutdown引數說明:
[-t] 在改變到其它runlevel之前,告訴
init多久以後關機。[-r] 重啟計算器。[-k] 並不真正關機,只是送警告訊號給每位登入者〔login〕。[-h] 關機後關閉電源〔halt〕。[-n] 不用init,而是自己來關機。不鼓勵使用這個選項,而且該選項所產生的後果往往不總是你所預期得到的。[-c] cancel current process取消目前正在執行的關機程式。所以這個選項當然沒有時間引數,但是可以輸入一個用來解釋的訊息,而這資訊將會送到每位使用者。[-f] 在重啟計算器〔reboot〕時忽略fsck
[-F]
在重啟計算器〔reboot〕時強迫fsck[-time] 設定關機〔shutdown〕前的時間。2.halt----最簡單的關機命令其實halt就是呼叫shutdown-hhalt執行時,殺死應用程序,執行sync系統呼叫,檔案系統寫操作完成後就會停止核心。引數說明:
[-n] 防止sync系統呼叫,它用在用fsck修補根分割槽之後,以阻止核心用老版本的超級塊〔superblock〕覆蓋修補過的超級塊。[-w] 並不是真正的重啟或關機,只是寫wtmp/var/log/wtmp〕紀錄。[-d] 不寫wtmp紀錄〔已包含在選項[-n]中〕。[-f] 沒有呼叫shutdown而強制關機或重啟。[-i] 關機〔或重啟〕前,關掉所有的網路介面。[-p] 該選項為預設選項。就是關機時呼叫poweroff3.rebootreboot的工作過程差不多跟halt一樣,不過它是引發主機重啟,而halt是關機。它的引數與halt相差不多。4.init

init
是所有程序的祖先,它的程序號始終為1,所以傳送TERM訊號給init會終止所有的使用者程序、守護程序等。shutdown就是使用這種機制。init定義了8個執行級別(runlevel)init 0為關機,init 1為重啟。關於init可以長篇大論,這裡就不再敘述。另外還有telinit命令可以改變init的執行級別,比如,telinit -iS可使系統進入單使用者模式,並且得不到使用shutdown時的資訊和等待時間。糾正一下HALT命令相當於SHUTDOWN-H NOW
後邊這個NOW 可以替換成關機時間的引數糾正一下,關於init
init 1
不是reboot,而是單使用者,init 6才是重啟,cloud天天用init 0關機,用init 6重啟,這個應該還是沒有記錯的。
inittab
檔案裡似乎是這麼寫的。

0
Halt
1 Single user
2 multi user without network
3 Multi user
4 unuse
5 X11
6
Reboot所說的8個,是加上Sscloud不知道執行級別Ssrunlevel 1有什麼區別,哪位可以指教一下?

Reboot與init 6的區別

Reboot與init 6的區別

起因在於:重啟伺服器後有時候服務不會啟動,而有時候又可以自動執行,唯一差別在於重啟命令用的是reboot還是init 6.

後查了相關資料,竟然大有玄機:

對這兩個操作使用man命令看到的內容如下:
init 6 Stop the operating system and reboot to the state defined by the initdefault entry in /etc/inittab.

reboot - reboot performs a sync(1M) operation on the disks, and then a
multi- user reboot is initiated. See init(1M) for details.

"init 6" 基於一系列/etc/inittab檔案,並且每個應用都會有一個相應shutdown指令碼。
'init 6' 呼叫一系列shutdown指令碼(/etc/rc0.d/K*)來使系統優雅關機; 
'reboot'並不執行這些過程,reboot更是一個 kernel級別的命令,不對應用使用shutdown指令碼。 .
我們應該在通常情況下使用 init 6.
在出問題的狀況下或強制重啟 時使用reboot

reboot is a more aggresive command to use. init 6 is much graceful

·         use of `init 6` will give the cleanest and orderly reboot (init informs svc.startd of the runlevel change and will move to the appropriate milestone).

·         use of `shutdown -y -g0 -i6 **message**` will invoke init as well as give you grace period and messages to user (shutdown invoked the same as init above).

·         halt,reboot,poweroff will not run any of the shutdown scripts and should be last resort.