使用 Upstart 快捷管理系統服務(一)

Upstart 是一個由 Canonical 公司(就是開發 Ubuntu 的公司)開發和維護的一個的基於事件的開源 Linux 服務管理程序,它目標是替換掉基於 System-V 規範的 /sbin/init 程序。mysql

爲何要用 Upstart ?

先說說傳統的 System-V init(如下簡稱 SysVinit)的問題,SysVinit 只是簡單地在系統啓動、結束和切換預約義的幾個 Runlevel 時根據文件名的順序執行調用實現了 System-V 定義的服務控制腳本,就是大部分人熟悉的如下幾個路徑和裏面的腳本內容格式:sql

/etc/inittab # 系統初始化過程的定義文件
/etc/init.d  # 存放實際的服務控制腳本
/etc/rc?.d   # 存放不一樣 Runlevel 對應 init.d 裏的腳本的軟鏈接
/etc/rc.*    # 特定狀況下執行的腳本

SysVinit 並不實際管理腳本具體作的事情,只要腳本能接受 start / restart / stop / status 等幾個參數就視爲符合定義(實際上即便不接受以上參數也能夠放入 init.d 裏讓 SysVinit 調用,但會產生非預期的效果),對於服務是否正常啓動,啓動後是否異常退出,SysVinit 並無論理,這每每須要開發者在編寫服務管理腳本時自行實現相關邏輯甚至編寫額外的守護進程保證服務程序的可用性(MySQL 自帶的 mysqld_safe 就是一個例子);shell

同時亦因爲這個緣由,SysVinit 沒法處理服務之間的依賴關係,例如 Tomcat 依賴 MySQL,那麼 Tomcat 啓動以前須要先啓動 MySQL,若是 MySQL 沒法啓動,Tomcat 也不該該啓動,但因爲 SysVinit 是順序執行的,即便配置了先啓動 MySQL 再啓動 Tomcat,即便 MySQL 啓動失敗,Tomcat 依然會被啓動,從而致使服務異常;架構

另外,因爲順序執行和沒法感知服務之間的依賴關係,使得經過 SysVinit 實現服務並行啓動加快系統啓動速度的方案變得困難。Upstart 就是爲了解決以上各類問題而被開發出來的。學習

怎樣使用 Upstart

在 Ubuntu 6.0 以上版本就已經開始集成 Upstart,因爲各個發行版及其各個版本安裝 Upstart 的方式和集成度有必定差別,須要額外展開,因此這裏先以 Ubuntu 系統基礎操做環境。.net

Upstart 的全部服務管理腳本存放在設計

/etc/init/*.conf # 文件名就是 service name

腳本內容也不像 SysVinit 那樣是一個普通的 shell 腳本,而是它預先規範好的一個配置文件(如下也稱之爲「配置文件」而非「腳本」),一個最基礎的配置文件是這樣的rest

description     "MySQL Service"

start on runlevel [2345]
stop on runlevel [!2345]

exec /usr/bin/mysqld

整個配置文件很是簡潔,第一行是服務描述,無關緊要,但通常會寫上以便理解,Upstart 保留了 Runlevel 的概念,這裏定義了該服務在 runlevel 爲 2 3 4 5 時啓動該服務,而非這幾個 Runlevel 時中止改服務,啓動服務的命令爲 /usr/bin/mysqld。把該配置文件保存到code

/etc/init/mysqld.conf

以後,咱們就能夠經過如下命令控制 MySQL Service 的啓動狀態進程

start mysqld   # 啓動
restart mysqld # 重啓
stop mysqld    # 中止
status mysqld  # 檢查狀態

在服務啓動以後,Upstart 會自動把該服務的標準輸出(stdout)內容保存在 /var/log/upstart/(service-name).log 文件裏,這個例子就是存放在 /var/log/upstart/mysqld.log 文件裏,供有須要時查閱。

可能有部分熟悉 MySQL 的同窗注意到,這裏用的是 mysqld 而不是 mysqld_safe,這是由於 Upstart 自己會用一個獨立的進程運行服務,不會讓服務阻塞 shell,並且獨立進程還會監控服務的存活狀態,當發現服務退出後作其它相關處理。

What's Next?

因爲 Upstart 的功能豐富,這裏不打算一次所有介紹完畢,將會分幾篇介紹,下一篇會介紹服務的依賴管理,狀態和事件的處理方式。


Coding 架構師 歐俊飛

【Coding 官方技術博客是 Coding 內部小夥伴在平時的工做學習過程當中關於技術、產品、設計等等方面的積累和分享,但願你們共同窗習共同進步!如轉載,請註明出處與做者,謝謝!】

相關文章
相關標籤/搜索