歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Linux配置啟動項,自啟動服務

Linux下有兩種機制,一個是舊式的System V initialization,它來源於Unix並且至今仍被各種Linux distros所采用;另一種是近幾年提出的Upstart機制。

參考:http://www.cnblogs.com/cassvin/archive/2011/12/25/ubuntu_init_analysis.html

這個也可以說是Linux的蛋疼的地方了,啟動的方式也有兩套,而且有的軟件用的是System V initialization機制,有的用的是Upstart機制。不同發行版采用的機制也不同,連配置工具也不同。。如apache用的是前者,mysql, mongodb用的是後者。

System V initialization機制

參考:http://zh.wikipedia.org/wiki/Init

不同操作系統默認的運行模式 

操作系統 默認的運行模式 AIX 2 Arch Linux 3 CentOS 3 Debian GNU/Linux 2 [5] Gentoo Linux 3 Mandriva Linux 5 Mac OS X 3 Red Hat Linux / Fedora Core 3 or 5 Slackware Linux 3 Solaris 3 [6] SUSE Linux 5 [7] Ubuntu (Server and Desktop) 2 [8] System V initialization機制蛋疼的是對於每一個運行模式,都有一個文件夾來存放啟動時要用的腳本。在/etc目錄下可以看到有rc0.d, rc1.d ... rc5.d, rcS.d等文件夾,而裡面的內容,大部分是從/etc/init.d裡軟鏈接過去的。。所以,如果想要增加一個啟動項,得先在/etc/init.d下增加自己的腳本,再在rc0.d等目錄裡創建軟鏈接,非常的麻煩。

所以Linux的發行版通常都 會有工具來自動生成這些軟鏈接配置。

System V initialization機制還有一個蛋疼的地方,它用序號的方式來表示啟動,停止順序。比如在/etc/rc0.d裡可以看到都是以S或者K開頭的腳本,S是start,K是kill的意思。S/K後面的數字表示順序,啟動時,從小到大,停止時,從大到小。比如:K09apache2,表示apache2這個服務會是在09這個順序停止。

CentOS下配置啟動項

CentOS用的是System V initialization機制。

CentOS下用的工具是chkconfig

Ubuntu兼容System V initialization和Upstart機制。

Ubuntu下對於System V initialization機制,用的工具是update-rc.d,

對於Upstart機制,要手動修改配置,不過有個initctl的工具可以用來啟動/停止/查看相關的進程。

對於CentOS,配置一個啟動服務還是比較簡單的,比如配置zookeeper服務自動啟動:

在/etc/init.d下創建一個腳本: 

#/bin/sh  
#chkconfig: 2345 20 80    
# description:  zookeeper1
case $1 in
          start)  /home/zookeeper/zookeeper345_1/bin/zkServer.sh start   ;;
          stop)  /home/zookeeper/zookeeper345_1/bin/zkServer.sh stop;;
          status)  /home/zookeeper/zookeeper345_1/bin/zkServer.sh status;;
          restart)  /home/zookeeper/zookeeper345_1/bin/zkServer.sh restart;;
              *)  echo "require start|stop|status|restart"  ;;
esac
這個腳本很簡單,就是判斷第一個參數的內容,再執行對應的程序。 

要注意的是chkconfig的兩行配置一定要有: 

#chkconfig: 2345 20 80    
#description:  zookeeper1
#chkconfig後面的2345表示系統啟動的模式(runlevel),20表示啟動的順序,80表示停止的順序。 

再加上可執行權限: 

chmod +x /etc/init.d/zookeeper1
chkconfig --add zookeeper1

取消啟動項: 

chkconfig zookeeper off 

刪除啟動項: 

chkconfig --del zookeeper1

Ubuntu下配置啟動項

System V initialization機制

對於Ubuntu,如果是使用System V initialization機制,則可以參照上面chkconfig的腳本,再用update-rc.d命令設置一下: 

update-rc.d zookeeper1 defaults 

取消啟動項: 

update-rc.d zookeeper1 disable
刪除啟動項: 
update-rc.d -f zookeeper1 remove

Upstart機制

Upstart機制相當的復雜,具體可以參考:http://upstart.ubuntu.com/cookbook,這裡只列一些要點。

如果使用的是Upstart機制,則可以直接在/etc/init目錄下創建一個以".conf"結尾的腳本,如,zookeeper1.conf: 

#設置啟動停止的runlevel
start on runlevel [2345]
stop on runlevel [!2345]

#設置自動重啟
respawn
respawn limit 2 5

umask 007

kill timeout 30

#設置啟動的用戶
setuid zookeeper
setgid zookeeper

#注意使用的是start-foreground參數,這樣會zookeeper進程會在前台運行,這樣upstart才可以控制這個進程
script
exec  /home/hengyunabc/soft/zookeeper-3.4.5/bin/zkServer.sh start-foreground
end script
注意,這樣子啟動的話,zookeeper的日志是寫到了/var/log/upstart/zookeeper1.log裡去了。 

如果想用zkServer.sh start參數來啟動的話,則比較麻煩,因為upstart不能關聯到java進程,只能關聯到bash進程。盡管upstart有一些expect daemon,expect fork的參數,但是貌似都不合適。

可以參考這個帖子:http://stackoverflow.com/questions/12200217/can-upstart-expect-respawn-be-used-on-processes-that-fork-more-than-twice

裡面提到了一種定時檢測進程進程存活,如果不存活,則啟動的辦法。可以用這個辦法來處理腳本調用的情況。

或者,直接在upstart腳本裡啟動java進程,可以參考upstart文檔,或者這裡:

http://zookeeper-user.578899.n2.nabble.com/Zookeeper-run-as-non-root-td7577797.html

總結

和System V initialization機制對比,Upstart機制雖然功能強大,比如可以自定義各種事件的觸發處理,但是遇到復雜情況也不容易配置好。

Upstart的status只能判斷進程是否存活(而且不一定准確),而System V initialization則可以靈活地調用自己的腳本來得到進程更詳細的狀態信息。

其它的一些東東:

supervisor,python寫的進程管理工具:http://supervisord.org/

參考

http://www.debian.org/doc/manuals/debian-reference/ch03.en.html

https://github.com/LucidWorks/solr-fabric/blob/master/templates/zookeeper-upstart.conf

Copyright © Linux教程網 All Rights Reserved