閱讀119 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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 [5]
Gentoo Linux 3
Mandriva Linux 5
Mac OS X 3
Red Hat Linux / Fedora Core 3 or 5
Slackware Linux 3
Solaris [6]
SUSE Linux [7]
Ubuntu (Server and Desktop) [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機製相當的複雜,具體可以參考: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

  上一篇:go 線程間共享數據
  下一篇:go 在Android中使用native程序(非Java)來廣播intent