Linux配置啟動項,自啟動服務
--2014-02-15 更新:
看到新聞說ubuntu將切換到systemd。。
https://www.cnbeta.com/articles/272538.htm
Linux下有兩種機製,一個是舊式的System V initialization,它來源於Unix並且至今仍被各種Linux distros所采用;另一種是近幾年提出的Upstart機製。
參考:https://www.cnblogs.com/cassvin/archive/2011/12/25/ubuntu_init_analysis.html
這個也可以說是Linux的蛋疼的地方了,啟動的方式也有兩套,而且有的軟件用的是System V initialization機製,有的用的是Upstart機製。不同發行版采用的機製也不同,連配置工具也不同。。如apache用的是前者,mysql, mongodb用的是後者。
System V initialization機製
參考:https://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] |
所以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機製相當的複雜,具體可以參考:https://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的參數,但是貌似都不合適。
可以參考這個帖子:https://stackoverflow.com/questions/12200217/can-upstart-expect-respawn-be-used-on-processes-that-fork-more-than-twice
裏麵提到了一種定時檢測進程進程存活,如果不存活,則啟動的辦法。可以用這個辦法來處理腳本調用的情況。
或者,直接在upstart腳本裏啟動java進程,可以參考upstart文檔,或者這裏:
https://zookeeper-user.578899.n2.nabble.com/Zookeeper-run-as-non-root-td7577797.html
總結
和System V initialization機製對比,Upstart機製雖然功能強大,比如可以自定義各種事件的觸發處理,但是遇到複雜情況也不容易配置好。
Upstart的status隻能判斷進程是否存活(而且不一定準確),而System V initialization則可以靈活地調用自己的腳本來得到進程更詳細的狀態信息。
其它的一些東東:
supervisor,python寫的進程管理工具:https://supervisord.org/
參考
https://www.debian.org/doc/manuals/debian-reference/ch03.en.html
https://github.com/LucidWorks/solr-fabric/blob/master/templates/zookeeper-upstart.conf
最後更新:2017-04-03 12:55:00
上一篇:
線程間共享數據
下一篇:
在Android中使用native程序(非Java)來廣播intent
經典白話算法之中綴表達式和後綴表達式
如何使sublime text側邊工程欄一直打開的狀態
Android剪切板(ClipboardManager)複製文本
【播放器--場景】使用播放器實現重播視頻
數字時鍾(數碼管顯示)例如:23-59-23
Windows開源Web服務器性能和壓力測試工具
wscript:329: error: Could not autodetect OpenSSL support. Make sure OpenSSL development packages are
Mysql JDBC驅動版本與Mysql版本的對應問題
myeclipse9中Jquery.js提示出錯
Java網絡教程-基礎