Linux系統服務及其創建詳解(service/chkconfig)


我們在日常使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM