我們在日常使用Linux的過程中經常會用到service XXX start/stop/restart等命令對相關系統服務進行控制。(CentOS在版本7之前,CentOS7以及最新版Ubunt都是用systemctl來對系統服務進行管理,當然原來的還是可以用的=。=)
看到公司的產品也是使用service開關系統服務的,查閱了相關資料,特在此總結一下。
part1 守護進程daemon
翻開任意一本介紹Unix/Linux的書幾乎都能找到守護進程相關內容(我是從APUE才真正認識到daemon的),用比較直觀的說法來介紹daemon進程就是在后台運行,不受用戶終端控制,而且啟動后始終在默默運行的服務。
用百度百科上的一段話來講就是:
守護進程是一個在后台運行並且不受任何終端控制的進程。Unix操作系統有很多典型的守護進程(其數目根據需要或20—50不等),它們在后台運行,執行不同的管理任務。 用戶使守護進程獨立於所有終端是因為,在守護進程從一個終端啟動的情況下,這同一個終端可能被其他的用戶使用。例如,用戶從一個終端啟動守護進程后退出,
然后另外一個人也登錄到這個終端。用戶不希望后者在使用該終端的過程中,接收到守護進程的任何錯誤信息。同樣,由終端鍵人的任何信號(例如中斷信號)也不應該影響先前在該終端啟動的任何守護進程的運行。
雖然讓服務器后台運行很容易(只要shell命令行以&結尾即可),但用戶還應該做些工作,讓程序本身能夠自動進入后台,且不依賴於任何終端。 守護進程沒有控制終端,因此當某些情況發生時,不管是一般的報告性信息,還是需由管理員處理的緊急信息,都需要以某種方式輸出。
Syslog 函數就是輸出這些信息的標准方法,它把信息發送給 syslogd 守護進程。
part2 rc.d (runlevel control directory)運行等級控制目錄
在Linux的/etc/下存在一個非常重要的文件夾rc.d,這個文件夾下有init.d這個重要的文件夾。/etc/下還有rcn.d(n=0-6)這幾個文件夾(軟連接到/etc/rc.d/rcn.d)。
目錄里面都是一些可執行文件,而且這些文件都是些文本文件,可以用vi打開。
啟動腳本都被放在/etc/rc.d/init.d。這些腳本被ln 命令來連接到 /etc/rc.d/rcn.d 目錄。(這里的n 就是運行級0-6)
例如/etc/rc.d/rc2.d 下面的S10network 就是連接到/etc/rc.d/init.d下的network 腳本的。
不同的運行等級意義如下所示:
等級0表示:表示關機
等級1表示:單用戶模式
等級2表示:無網絡連接的多用戶命令行模式
等級3表示:有網絡連接的多用戶命令行模式
等級4表示:不可用
等級5表示:帶圖形界面的多用戶模式
等級6表示:重新啟動
系統從不同運行等級啟動時就會找到相應文件夾rc.d/rcn.d中找到開始服務的腳本(以S開頭,數字表示優先級)並啟動,同理關機時同樣使用K開頭的軟連接關閉服務。
part3 service&chkconfig
service這個命令我們使用的比較多,也知道是對系統服務進行控制,而chkconfig就是控制service所管理服務的一個命令。
首先來看看/etc/init.d/文件夾下一個典型的腳本文件樣式:
#!/bin/bash # chkconfig: - 90 10 # description: test service # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network RETVAL=0 # 調用service xxxd start時執行的邏輯,一般這里就調用我們的程序的啟動腳本,帶些必要的參數等,以啟動我們的進程,然后將pid寫到相應的文件中 start() { echo "started" } #執行service xxxd stop時執行的邏輯,一般這里我們就找到相應的pid文件,然后kill掉相應的進程即可 stop() { echo "stopped" } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart|reload) stop start RETVAL=$? ;; condrestart|try-restart|force-reload) if [ -f /var/lock/subsys/$prog ]; then stop start RETVAL=$? fi ;; status) echo "status" RETVAL=1 ;; *) echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}" exit 1 esac exit $RETVAL
里面有不少start/stop/restart相關單詞。就算是不懂bash腳本語法應該也能猜到它的用處:負責控制服務的開啟與關閉,以及查看服務狀態。
當使用service XXXX start/stop等命令的時候其實就是這個腳本在產生作用!
而創建一個系統服務的關鍵也就是編寫一個這樣的腳本(當然得先有一個daemon程序,不過這個並不是本文主題:))而對於這個腳本照樣畫葫蘆好像也不難。
創建完成之后我們就可以用chkconfig來注冊這個service了:
1.順序執行以下命令
2.現在就可以用
等命令管理服務
3.chkconfig常用法:
參考:https://blog.csdn.net/lanyang123456/article/details/54695567
https://blog.csdn.net/a1282379904/article/details/77894102
https://zhidao.baidu.com/question/140070601.html