一、概述
/etc/init.d目錄下包含的指令碼檔案,在系統
啟動時或更改執行級別時由init程序執行。
在/etc/rc?.d目錄下的符號鏈結檔案的名字命名規則是:
s
mmscript
或者k
mmscript
。
mm是兩位數,script是指令碼的名字,這個名字和其指向在init.d目錄下真正的指令碼名字一致。如/etc/rc2.d/s12starteb 對應的 /etc/init.d/starteb。
當init程序改變到乙個執行級別n,rcn.d目錄下的指令碼就會被執行,首先,執行以k開頭的指令碼,指令碼執行引數是stop,然後,執行以s開頭的指令碼,指令碼執行引數是start,k表示殺死某項服務,而s代表開啟某項服務。
例如,我們從執行級別2切換到執行級別3,init程序就會首先執行rc3.d目錄下所有以k開頭的指令碼,引數為stop,然後執行rc3.d目錄下所有以s開頭的指令碼,引數為start。
mm代表的兩位數,用於決定執行這些指令碼的順序,數值越小,越先被執行。例如,k20指令碼將會先於k30指令碼執行。這被用於某些服務必須先於其他服務執行的情況。例如,bind服務必須先於inn服務執行,在這種情況下,bind的指令碼數值就應該比inn服務的小,像這樣:
/etc/rc2.d/s17bind有兩個執行級別,0(halt)和6(reboot)有一些不同。在這兩個執行級別中,以s開頭的指令碼仍然是在以k開頭的指令碼之後呼叫,但他們的引數全都是stop,而不是start。/etc/rc2.d/s70inn
二、書寫指令碼
系統啟動或者更改執行級別時需要開啟或者關閉的服務,其指令碼應該放置在/etc/init.d目錄下,這些指令碼可以接收乙個引數,這個引數可以是:
start 開啟服務
stop 關閉服務
restart 如果服務在執行,關閉並重啟服務;如果服務沒有在執行,開啟服務
init.d目錄下的所有指令碼都應該支援start,stop,restart,force-reload引數,而reload引數是可選的。
init.d目錄下的所有指令碼必須保證足夠健壯,比如當某個服務正在執行的時候,呼叫start,它應該能夠正確返回而且不會產生多個該服務的拷貝,還有當某服務不在的時候呼叫stop也不會出錯。
在init.d目錄下的指令碼中應該小心使用set -e。書寫正確的init.d指令碼必須接受各種各樣的錯誤退出狀態。通用的init.d函式庫對於呼叫set -e不夠安全,因而在init.d指令碼中,盡量避免使用set -e,取而代之,分開檢測每條命令的結果。
三、指令碼示例
/etc/rc2.d/s12starteb -> /etc/init.d/starteb
#!/bin/sh參考:name=startwpa.sh
path=$path:/usr/local/sbin
start_it_up()
shut_it_down()
reload_it()
{}case "$1" in
start)
start_it_up
;;stop)
shut_it_down
;;status)
status_of_proc
;;reload|force-reload)
reload_it
;;restart)
shut_it_down
start_it_up
;;*)
echo "usage: /etc/init.d/$name " >&2
exit 2
;;esac
9.3 system run levels and
init.d
scripts
linux系統執行級別
級別 系統 說明centos6 centos6s使用 centos7 centos7使用 0關機狀態 runlevel0 init 0 1 2 3 4 5 6 poweroff.target init 0 1 2 3 4 5 6 或systemctl isolate multi user.targe...
Linux系統執行級別
執行級0 關機。執行級1 單使用者模式,系統出現問題時可使用這種模式進入系統維護,典型的使用場景是在忘記root密碼時可進入此模式修改root密碼。執行級2 多使用者模式,但是沒有網路連線。執行級3 完全多使用者模式,這也是linux伺服器最常見的執行級。執行級4 保留未使用。執行級5 視窗模式,支...
Linux系統的執行級別
init是由核心啟動的使用者級程序,rhel7以systemd代替。在 etc rc.d 目錄下有7個目錄,對應7個執行級別,這些目錄下都是符號鏈結檔案,指向 etc rc.d init.d 目錄下的service指令碼檔案。系統開機後,會根據指定的執行級別進入指定的目錄檔案,並按順序執行。指令碼檔...