Linux-啓動和服務(service)

以下基於我對文末中各種資料的理解,如有錯誤還望指出

查詢開啓及關閉服務的命令可直接翻到文末。

service和daemon

爲了支持某些功能,操作系統需要在後臺運行一些服務和應用程序,這些就是service和daemon了。比如說如果要像遠程連接到linux主機,需要開啓ssh服務。

管理服務

計算機中服務衆多,ssh要開啓ssh服務,使用apache要開啓apache服務,不可能每次要用的時候都自己手動開啓,例如我們希望一臺服務器開機就可以運行apache服務,所以我們需要一些工具(service manager)來管理各種服務,規定哪些服務在什麼時候開啓,在什麼時候關閉。當然規定服務的啓動和關閉一般說的都是計算機啓動時,所以這就離不開init system

系統的第一個進程是init ,所有的其它進程都是它的子進程,init system 規定了開機應該如何(何時)啓動各種進程,當然其中就包括各種服務。

主要的init system有以下幾個

  • System V
    • Debian 6 and earlier
    • Ubuntu 9.04 and earlier
    • CentOS 5 and earlier
  • Upstart
    • Ubuntu 9.10 to 14.10, including Ubuntu 14.04
    • CentOS 6
  • systemd
    • Debian 7 and 8
    • Ubuntu 15.04 and newer
    • CentOS 7

system V

使用system V時,啓動是分爲好幾個runlevel的,通過調用不同時刻對應的文件夾裏(下文說到的rc?.d )的腳本文件而達到啓動或關閉服務的目的,各個level對應的時刻可以通過man runlevel 查到。

  • 0 停機,關機
  • 1 單用戶,無網絡連接,不運行守護進程,不允許非超級用戶登錄
  • 2 多用戶,無網絡連接,不運行守護進程
  • 3 多用戶,正常啓動系統
  • 4 用戶自定義
  • 5 多用戶,帶圖形界面
  • 6 重啓

Ubuntu16.04 下runlevel的manpage中有這樣一行:

“Runlevels” are an obsolete way to start and stop groups of services used in SysV init.

確實,SysV已經逐漸淡出歷史舞臺了,不過在各個init system的發展中還是保持了對SysV的兼容性,因爲任何Linux發行版都不可能爲了採用新的init system而將所有的服務代碼修改一遍,所以你還是可以看到它的影子。

Ubuntu 16.04/etc/rc?.d/ 目錄下(其中的?是指0-6的數字或S),有很多鏈接,用ls -l 命令查看可以看到他們都指向的是/etc/init.d/ 目錄下的各個腳本,rc?.d 目錄名中的? 對應與各個runlevel ,系統啓動到特定的runlevel時會調用相應目錄的腳本。

如果仔細看會發現rc?.d/ 目錄下的各個鏈接都是以KS 打頭,其中K 表示kill,即此時這個服務應該被關閉,S 表示start,服務應該被啓動,在KS 後還有一個數字,代表優先級。

相關命令

chkconfig

$ chkconfig apache on
$ chkconfig apache off

這個命令是Red Hat/CentOS上的,可以用來設置開機啓動或關閉某個服務

update-rc.d

$ update-rc.d apache remove

這個是Ubuntu16.04 上的命令,下面是manpage的一部分

update-rc.d updates the System V style init script links /etc/rcrun‐level.d/NNname whose target is the script /etc/init.d/name.

service

暫時啓動某個服務,不影響下次開機,調用/etc/init.d/ 下的SysV的腳本以啓動服務

invoke-rc.d

啓動或暫停某個服務,debian上的命令

Upstart

upstart的腳本文件放在了/etc/init/ 目錄下。upstart裏面有job的概念,/etc/init/ 目錄下的每一個腳本都對應一個job,可以使用initctl 對這些job進行操作

命令

initctl

$ initctl list   #列出所有upstart管理的服務,即/etc/init/目錄下的腳本
$ initctl stop ssh-agent #關閉服務
$ initctl status ssh-agetn #查看服務狀態

service

啓動某個服務可以使用service 命令(對,service可以啓動SysV和upstart的腳本),當然這也是暫時的,不影響下次啓動

關閉upstart某個服務

echo manual | sudo tee /etc/init/SERVICE.override

SERVICE 是你要操作的服務名稱,只要/etc/init/ 目錄下某個服務有override結尾的文件,這個服務就會被禁用。

systemd

systemd和upstart是競爭關係,不過現在看來貌似systemd更強,Ubuntu16.04 上面大部分的服務都是有systemd管理的,小部分是由upstart管理的。systemd的

命令

systemctl

$ systemctl stop apache  #關閉apache服務
$ systemctl disable apache #設置開機不啓動

命令總結

  • systemctl 管理systemd

  • initctl 管理upstart

  • service 管理upstart和SysV

    管理他們在/etc/init//etc/init.d/ 下的腳本

  • update-rc.d SysV

  • invoke-rc.d SysV

  • chkconfig SysV

常用的有:

$ systemctl disable|enable SERVICE
$ systemctl start|stop|restart|status SERVICE
$ initctl start|stop|restart|status SERVICE
$ service SERVICE start|stop|restart|status
$ update-rc.d SERVICE enable|disable

其餘命令查看manpage吧

note:在不同的發行版中可能只有上面命令的某幾個,比如我現在用的16.04 除了沒有Red Hat特有的chkconfig之外都有,因爲從15.04開始ubuntu就開始採用systemd 了。


參考鏈接:

DigitalOcean

鳥哥的。。。gitbook

DigitalOcean-upstart

IBMdeveloperworks-upstart

AskUbuntu-how to enable and disable service

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章