參考:http://www.cnblogs.com/cassvin/archive/2011/12/25/ubuntu_init_analysis.html
這個也可以說是Linux的蛋疼的地方了,啟動的方式也有兩套,而且有的軟件用的是System V initialization機制,有的用的是Upstart機制。不同發行版采用的機制也不同,連配置工具也不同。。如apache用的是前者,mysql, mongodb用的是後者。
參考:http://zh.wikipedia.org/wiki/Init
不同操作系統默認的運行模式
所以Linux的發行版通常都 會有工具來自動生成這些軟鏈接配置。
System V initialization機制還有一個蛋疼的地方,它用序號的方式來表示啟動,停止順序。比如在/etc/rc0.d裡可以看到都是以S或者K開頭的腳本,S是start,K是kill的意思。S/K後面的數字表示順序,啟動時,從小到大,停止時,從大到小。比如:K09apache2,表示apache2這個服務會是在09這個順序停止。
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機制,則可以參照上面chkconfig的腳本,再用update-rc.d命令設置一下:
update-rc.d zookeeper1 defaults
取消啟動項:
update-rc.d zookeeper1 disable刪除啟動項:
update-rc.d -f zookeeper1 remove
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