鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 一、Zabbix 簡介 Zabbix 可以用來監控各種網路參數,來保證伺服器和系統的安全運行。並且 Zabbix 還提供了靈活的通知機制,以此來讓系統管理員快速定位/解決存在的各種問題。是一個基於 Web 界面提供的分散式系統監控以及網路監控功能 ...
回顧歷史
在linux發展的歷史長河中,按照順序依次出現過三種系統初始化機制,分別是:SysV init,Upstart,Systemd。不需要深究機制這個詞是不是準確。
所謂系統初始化機制,就是它們決定了在系統初始化時候,執行什麼操作以及按照什麼順序來執行這些操作。三種系統初始化機制各有優缺點,但是後浪總是會把前浪拍在沙灘上。以下優缺點引用自“網路”
- SysV init
SysV init中的服務串列按照順序啟動,保證腳本執行順序,也方便調試和排錯。但也因為串列啟動,導致系統啟動時間過長,在linux被應用到移動端後這個缺點成了大問題。
- Upstart
upstart通過並行啟動加快執行速度,但對於相互依賴的服務仍然採用併發啟動。它也支持硬體熱插拔時的動態啟動和卸載。
- Systemd
相比於upstart,systemd對於相互依賴的服務它也支持並行啟動。它的按需啟動比upstart更優秀。
這時候有人腦海裡面就會閃現出一個問題:如何判斷某個linux系統採用了哪種初始化系統?
因為系統初始化進程是linux啟動的第一個進程,其pid始終為1,因此可以從/proc/1/文件夾中獲取到一些蛛絲馬跡。在/proc目錄中,有一個名稱為exe的文件(和windows系統沒有半毛錢關係)。
exe文件指向啟動當前進程的可執行文件(完整路徑)的符號鏈接。通過查看exe文件的指向,可以知道當前系統所使用的初始化系統類型。
以下是在兩種不同初始化系統上執行stat /proc/1/exe
所得到的結果。從第二行結果可知,第一個系統採用的是Systemd,第二個系統採用的是SysV init初始化(init為其可執行文件)。
為什麼例子中沒有Upstart?因為找不到Upstart的系統
[root@ip-172-31-8-32 ~]# stat /proc/1/exe
File: ‘/proc/1/exe’ -> ‘/usr/lib/systemd/systemd’
Size: 0 Blocks: 0 IO Block: 1024 symbolic link
Device: 3h/3d Inode: 66971739 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
root@ip-172-31-9-10:/proc/1# stat /proc/1/exe
File: /proc/1/exe -> /init
Size: 0 Blocks: 0 IO Block: 1024 symbolic link
Device: 33h/51d Inode: 81 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
我是誰?我在哪裡?應該到哪裡去?
當明確了當前linux系統的初始化系統後,緊接著第二個問題接踵而至:怎麼做才能讓初始化系統知道,在系統啟動後要運行kafka或者nginx?
答案和把一頭大象裝入冰箱一樣:1. 打開冰箱門 2. 把大象裝進去 3. 關閉冰箱門
但是細節呢?細節就是1、完成服務腳本 2、將服務腳本放在固定的位置
,下麵是不同初始化系統放置服務腳本的位置
SysV init | Upstart | Systemd |
---|---|---|
/etc/init.d | /etc/init | /etc/rc.d/init.d |
下麵一一更詳細解釋
SysV init
- 編寫服務腳本。服務腳本主體採用shell語法編寫,一般應用程式都會提供自啟動腳本。下麵為一段例子腳本
#!/bin/bash
#service hello
start() {
echo 'start hello service...'
echo 'start hello service over'
}
stop() {
echo 'stop hello service...'
echo 'stop hello service over'
}
case $1 in
start)
start ;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "valid arg:[start|status|stop|restart]"
esac
exit 0
- 將其放在
/etc/init.d
目錄中。service --status-all
命令,會列舉/etc/init.d目錄中所有服務。以下結果說明,系統已經認識了服務hello
root@ip-172-31-9-10:/etc/init.d# service --status-all
[ - ] apparmor
[ ? ] apport
[ - ] dbus
[ - ] hello
[ ? ] hwclock.sh
...
- 使用命令
chkconfig --add hello
將服務hello添加到開機啟動中。 /etc目錄有6個子目錄,可以指定init.d目錄中所包含服務腳本的執行場景。
目錄 | level | 執行場景 |
---|---|---|
rc0.d | 0 | 關機 |
rc1.d | 1 | 單用戶模式 |
rc2.d | 2 | 無網路連接的多用戶命令行模式 |
rc3.d | 3 | 有網路連接的多用戶命令行模式 |
rc4.d | 4 | 系統保留 |
rc5.d | 5 | 帶圖形界面的多用戶模式 |
rc6.d | 6 | 重新啟動 |
每個目錄中的文件都鏈接至init.d目錄中的服務腳本。以下為rc0.d目錄內容,其顯示在關機場景時,將rc0.d目錄中所有的服務關閉(K-kill)
root@weidengbai:/etc/rc0.d# ls -l
total 0
lrwxrwxrwx 1 root root 13 Apr 23 2020 K01atd -> ../init.d/atd
lrwxrwxrwx 1 root root 20 Apr 23 2020 K01cryptdisks -> ../init.d/cryptdisks
lrwxrwxrwx 1 root root 25 Apr 23 2020 K01multipath-tools -> ../init.d/multipath-tools
lrwxrwxrwx 1 root root 15 Mar 25 09:48 K01nginx -> ../init.d/nginx
....
當運行chkconfig --add hello
命令時,chkconfig 會自動創建對應目錄的軟連接。