1. 程式人生 > >用service命令和chkconfig命令管理服務進程

用service命令和chkconfig命令管理服務進程

開啟 應用程序 設置 安裝服務 oot lin sap apache cal

service命令可以快速地開啟和停止linux中的服務程序,這在調試過程中非常有用.chkconfig命令可以快速地設置開機時需要自動啟動的服務程序.
  這兩個命令的功能都可以通過其他方法實現,只不過有了它們之後更加方便,維護工作可以更加輕松.

service命令和進程管理腳本

  在debian linux中如果用apt-get命令安裝mysql,nginx等服務程序,安裝程序都會自動在/etc/init.d/目錄中創建一個管理此服務進程用的shell腳本,如:

/etc/init.d/mysql
/etc/init.d/nginx
/etc/init.d/keepalived

  

  這樣就用可以用/etc/init.d/{腳本文件名} start

service {腳本文件名} start 來啟動一個服務,如:

#啟動mysql服務
/etc/init.d/mysql start 
service mysql start

  

  如果進程管理腳本支持restart命令參數,還可以用 /etc/init.d/{腳本文件名} restart service {腳本文件名} restart 來重新啟動 一個服務,如:

#重新啟動mysql服務
/etc/init.d/mysql restart 
service mysql restart

  

  上面兩個命令的效果是一樣的,這樣重啟mysql或php-fpm的時候就不用每次都先把進程kill掉,然後寫一大段路徑和參數來啟動服務了.只不過用service命令的話只要記住腳本文件名,不用寫絕對地址,這樣比較方便,默認的腳本文件名都是和服務程序的名字一樣的.

  如果自己編譯安裝php-fpm等服務程序,/etc/init.d目錄中的這個腳本是需要自己加的.幸運的是很多服務程序的源碼包中都附帶了這個腳本如:

mysql5.6源碼中的 support-files/mysql.server 
php7源碼中的 sapi/fpm/init.d.php-fpm 
redis2.6源碼中的 utils/redis_init_script

  

這些就是應用程序官方提供的進程管理腳本,把它們復制到/etc/init.d目錄中,順便改一個簡短點兒的名字,就可以用service 命令管理服務進程了.別忘了給復制到/etc/init.d中的腳本加可執行權限.

chmod +x /etc/init.d/mysql /etc/init.d/nginx /etc/init.d/redis

  

  有的時候需要修改腳本中的參數如路徑名等才能順利執行,需要簡單調試一下.

  這裏需要註意一下service命令後面的參數
  service命令後面的第一個參數,一定要和/etc/init.d中的腳本名字一樣,要不然系統會報錯,為了簡單,可以直接命名成服務程序名字.
  service命令的第二個參數,如start,stop,restart,它是傳給進程管理腳本的.所以是否支持這個參數不是service命令決定的,是進程管理腳本決定的,使用不同的進程管理腳本,可以選擇的命令參數和功能也是不同的.
  進程管理腳本都會支持start和stop兩個命令參數,還有可能支持其他的命令參數.一般可以用service {腳本名}查看腳本的幫助信息,裏面有支持的命令參數如:

[email protected]:~# ls -l /etc/rc2.d/
total 4
-rw-r--r-- 1 root     root     677 Nov 17  2012 README
lrwxrwxrwx 1 root     root      17 May 30  2011 S01ipvsadm -> ../init.d/ipvsadm
lrwxrwxrwx 1 root     root      17 Feb  6 13:45 S16apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root     root      20 Jun 10 16:31 S17keepalived -> ../init.d/keepalived
lrwxrwxrwx 1 root     root      19 Jun 13 13:54 S17memcached -> ../init.d/memcached
lrwxrwxrwx 1 root     root      15 Feb  6 13:45 S17mysql -> ../init.d/mysql
lrwxrwxrwx 1 root     root      28 Feb 16 13:14 S17nagios-nrpe-server -> ../init.d/nagios-nrpe-server
lrwxrwxrwx 1 root     root      15 Feb  6 13:45 S17nginx -> ../init.d/nginx
lrwxrwxrwx 1 root     root      15 Feb  6 13:45 S17rsync -> ../init.d/rsync
lrwxrwxrwx 1 root     root      16 Feb  6 13:45 S17vsftpd -> ../init.d/vsftpd
lrwxrwxrwx 1 root     root      22 Apr  3 14:06 S18avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx 1 root     root      15 Feb  6 13:45 S18exim4 -> ../init.d/exim4
lrwxrwxrwx 1 root     root      18 Feb  6 13:45 S20rc.local -> ../init.d/rc.local

  

  也有些服務,如用apt-get安裝的keepalived的管理腳本,用這個方法查看不到幫助信息.想知道這個腳本裏支持哪些命令參數,只能自己讀一下腳本了,shell腳本的語法比較簡單,還是挺容易看懂的.

  如果需要編譯安裝服務程序,並且源碼裏沒有進程管理腳本,如memcached.那只能上網查別人寫好的腳本了.要不然自己寫個進程管理腳本也不錯~

chkconfig命令和/etc/rc.local腳本

  chkconfig命令可以用來配置某一項服務是否開機自動啟動,有些版本的linux需要自己手動安裝這個命令,如debian linux中安裝chkconfig命令:

apt-get install chkconfig

  

  如果沒有chkconfig命令,想添加一項開機自動啟動的服務,可以把開啟服務的命令放進/etc/rc.local中,只不過用chconfig命令更加方便
  chkconfig命令同樣要依賴放在/etc/init.d目錄中的進程管理腳本.
  chkconfig命令示例:

#以下腳本在debian linux中測試通過
chkconfig --help #查看chkconfig命令語法
chkconfig -l #查看所有服務程序在所有運行級別下的是否開機自動啟動
chkconfig -l mysql #查mysql服務在所有運行級別下的是否開機自動啟動
chkconfig -a mysql #在服務列表中添加新的服務mysql並設置成開機自動啟動
chkconfig -d mysql #取消mysql服務的開機自動啟動設置
chkconfig -s mysql 2345 #讓mysql在2345這幾個運行級別下開機自動啟動,如果某一運行級別下的鏈接沒有正確添加,可以使用這個命令添加一下.

  

chkconfig的原理

  /etc目錄下有一組rc開頭目錄,它們用來存放在各個運行級別下linux自動啟動的服務:

/etc/rcS.d/  #開機後需要自動啟動的一些基本服務
/etc/rc0.d/  #運行模式0下需要啟動的服務
/etc/rc1.d/  #運行模式1下需要啟動的服務
/etc/rc2.d/  #運行模式2下需要啟動的服務
/etc/rc3.d/  #運行模式3下需要啟動的服務
/etc/rc4.d/  #運行模式4下需要啟動的服務
/etc/rc5.d/  #運行模式5下需要啟動的服務
/etc/rc6.d/  #運行模式6下需要啟動的服務

  

  這些目錄中除README說明文檔之外放的都是些軟鏈接(符號鏈接),這些鏈接指向各服務的進程管理腳本,而這些進程管理腳本都放在/etc/init.d目錄中.
  debian linux的默認運行級別是2,看一下/etc/rc2.d/中的內容

[email protected]:~# ls -l /etc/rc2.d/
total 4
-rw-r--r-- 1 root     root     677 Nov 17  2012 README
lrwxrwxrwx 1 root     root      17 May 30  2011 S01ipvsadm -> ../init.d/ipvsadm
lrwxrwxrwx 1 root     root      17 Feb  6 13:45 S16apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root     root      20 Jun 10 16:31 S17keepalived -> ../init.d/keepalived
lrwxrwxrwx 1 root     root      19 Jun 13 13:54 S17memcached -> ../init.d/memcached
lrwxrwxrwx 1 root     root      15 Feb  6 13:45 S17mysql -> ../init.d/mysql
lrwxrwxrwx 1 root     root      28 Feb 16 13:14 S17nagios-nrpe-server -> ../init.d/nagios-nrpe-server
lrwxrwxrwx 1 root     root      15 Feb  6 13:45 S17nginx -> ../init.d/nginx
lrwxrwxrwx 1 root     root      15 Feb  6 13:45 S17rsync -> ../init.d/rsync
lrwxrwxrwx 1 root     root      16 Feb  6 13:45 S17vsftpd -> ../init.d/vsftpd
lrwxrwxrwx 1 root     root      22 Apr  3 14:06 S18avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx 1 root     root      15 Feb  6 13:45 S18exim4 -> ../init.d/exim4
lrwxrwxrwx 1 root     root      18 Feb  6 13:45 S20rc.local -> ../init.d/rc.local

  

  用chkconfig命令操作的添加或者刪除開機自動啟動服務程序,其實就是創建或刪除這些目錄中的軟鏈接.
  每個軟鏈接的命名都是"大寫S+運行順序+腳本名稱",裏面有一個鏈接是"S20rc.local -> ../init.d/rc.local".打開它指向的腳本/etc/init.d/rc.local看一下,發現它裏面調用了/etc/rc.local這個腳本.原來/etc/rc.local中的命令是在這兒執行的.
  如果把mysql服務的啟動命令放進/etc/rc.local中,操作系統也會在執行這個列表的時候執行它,不過它的執行順序是20,比排在前面的S17mysql還要晚一些~

用service命令和chkconfig命令管理服務進程