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

Ubuntu upstart job解析

Ubuntu upstart job解析   1.傳統的啟動方式   init進程在啟動時會調用/etc/rc${RUNLEVEL}.d文件夾下的腳本,這些腳本是/etc/init.d/下腳本的軟鏈接,runlevel包括0-9,S,S是single模式的runlevel(想起上次服務器宕掉,提示init進程segment fault,而據負責維護的同事說內核沒有問題,可能是/etc/rcS.d/下的服務有問題?真是這樣的話可以disable後啟動看看有沒有問題),軟連接文件名是這樣的[S|K][NN]${name},S表示服務enabled,K表示disabled,NN是0-99的數字,數字可以重復,但在系統下次升級時會根據依賴關系重新整理一次。update-rc.d命令正是通過建立軟鏈接來安裝刪除upstart script的命令。   每個服務啟動腳本(upstart script)都符合lsb規范(linux二進制程序與運行程序接口規范),需要加上lsb頭,lsb頭說明了在哪些runlevel是enabled,哪些disabled的,以及服務的依賴關系。刪除一個S開頭的軟鏈接並不意味著linux以後開機就不啟動這個服務了,升級之後仍然可能又安裝了對應S軟鏈接,應該通過update-rc.d命令的disable選項建立K軟鏈接可以達到效果。   該命令有如下選項:remove,defaults,start|stop,disable|enable。default安裝的服務是2,3,4,5 enable,0,1,6 disable,後面指定一個整數是K和S帶的整數,如果指定兩個證書,則分別是S和K帶的整數,推薦K帶的整數為100-S帶的整數。該命令還有兩個選項-n,-f,man page的說明和例子很豐富。     2.ubuntu下upstart流程   順著update-rc.d命令的man page,我們注意到insserv,我們得知update-rc.d這個命令在debian 6之後已經obsolute(這是system-v style的),推薦可以使用insserv命令,該命令查看/etc/insserv.conf,/etc/insserv.conf.d,/etc/insserv/overrides下的LSB系統設施(LSB System Facilities)。   基本命令initctl和chkconfig相似,list列出所有的狀態,status可以列出單個服務的狀態,我們注意到其中包括的服務比/etc/rc.${RUNLEVEL}多很多,從initctl的man page看其服務配置在/etc/init目錄下設置,/etc/init/rc.conf清楚地表明是"System V runlevel compatibility",並執行exec /etc/init.d/rc $RUNLEVEL,現在我們可以看出/etc/init和/etc/init.d的差別了。差別就是/etc/init.d是system v style的upstart scripts目錄,並按runlevel存放,/etc/init是ubuntu下的upstart腳本規范,到lucid(10.04 LTS)為止,ubuntu一直在往這個規范遷移,system v style的服務只是該規范下的一個服務(可以看看service rc status)。/etc/init下的配置文件相對比/etc/init.d中的腳本要簡潔。   再看service腳本,可以看到它優先查看/etc/init文件夾,然後才查看/etc/init.d的腳本。   [plain]  if [ -r "/etc/init/${SERVICE}.conf" ]; then      # Upstart configuration exists for this job      case "${ACTION}" in         start|stop|status|reload)            # Action is a valid upstart action            exec ${ACTION} ${SERVICE} ${OPTIONS}         ;;           restart)            # Map restart to the usual sysvinit behavior.            stop ${SERVICE} ${OPTIONS} || :            exec start ${SERVICE} ${OPTIONS}         ;;           force-reload)            # Upstart just uses reload for force-reload            exec reload ${SERVICE} ${OPTIONS}         ;;        esac   fi   可見upstart job不是調用腳本,而是使用start,stop,status,reload這些二進制程序。--full-restart和force-reload這兩個選項倒是我之前沒有注意到的。 另外Ubuntu上chkconfig命令很強也很方便,可以列出服務的狀態,也可能方便enable,disable。     附: Fedora upstart流程   在我的Fedora 17(BeefyMiracle)上,也支持system v style upstart scripts,但也有自己的規范,並且system v style優先。其自己的service文件在/usr/lib/systemd/system/下,如sshd.service,似乎比ubuntu更易讀,使用systemctl調用,並且在標准錯誤上會輸出Redirecting to /bin/systemctl ${OPTIONS} ${SERVICE}.service(只要標准錯誤是字符設備)。   如果upstart script在/etc/init.d下,Fedora下既沒有update-rc.d也沒有insserv,應該用chkconfig。   如果在/usr/lib/systemd/system/下,由於Fedora下chkconfig也只對system v style的服務有效,做法是還使用systemctl,如systemctl enable/disable iptables.service。     待續:   /lib/lsb/init-functions (Fedora /usr/lib/functions)
Copyright © Linux教程網 All Rights Reserved