天天看點

在樹莓派上使Jexus以服務運作、開機自啟前言目标名詞過程引用

前言

此前,我們通過

在樹莓派上借助Mono + Jexus 布署 .Net 4.0 WebForm應用

,簡單介紹了如何在樹莓派上布署 Jexus,并承載一個Asp.Net WebForm應用,但現在問題又來了,一不小心停電重新開機後,Jexus 卻沒有啟動,而rc.local的啟動方式屬于一次性的,無法通過統一的指令控制,對于官方介紹上說的jws.start,請原諒我沒找到(手動瀑布汗)。

目标

1、通過systemd管理jws服務,使其能通過systemctl控制啟動、停止、重新開機。

2、使jws能夠開機自動啟動

名詞

systemd

systemd這一名字源于Unix中的一個慣例:在Unix中常以“d”作為系統守護程序(英語:daemon,亦稱背景程序)的字尾辨別。

systemd 是一個專用于 Linux 作業系統的系統與服務管理器。 當作為啟動程序(PID=1)運作時,它将作為初始化系統運作, 也就是啟動并維護各種使用者空間的服務。

systemd 将各種系統啟動和運作相關的對象, 表示為各種不同類型的單元(unit), 并提供了處理不同單元之間依賴關系的能力。 而以 .service 為字尾的單元檔案, 封裝了一個被 systemd 監視與控制的程序。

單元檔案中的 [Unit] 小節 包含與單元類型無關的通用資訊,服務單元(.service)檔案必須包含一個 [Service] 小節。

Unit小節

Description=

對單元進行簡單描述的字元串。 用于UI中緊跟單元名稱之後的簡要描述文字。 例如 "Apache2 Web Server"

Documentation=

一組用空格分隔的文檔URI清單, 這些文檔是對此單元的詳細說明。 可接受 "http://", "https://", "file:", "info:", "man:" 五種URI類型。

Wants=

此選項是 Requires= 的弱化版。 當此單元被啟動時,所有這裡列出的其他單元隻是盡可能被啟動。 但是,即使某些單元不存在或者未能啟動成功, 也不會影響此單元的啟動。 推薦使用此選項來設定單元之間的依賴關系。

Before=, After=

強制指定單元之間的先後順序,接受一個空格分隔的單元清單。 假定 foo.service 單元包含 Before=bar.service 設定, 那麼當兩個單元都需要啟動的時候, bar.service 将會一直延遲到 foo.service 啟動完畢之後再啟動。 注意,停止順序與啟動順序正好相反,也就是說, 隻有當 bar.service 完全停止後,才會停止 foo.service 單元。 After= 的含義與 Before= 正好相反。 假定 foo.service 單元包含 After=bar.service 設定, 那麼當兩個單元都需要啟動的時候, foo.service 将會一直延遲到 bar.service 啟動完畢之後再啟動。 注意,停止順序與啟動順序正好相反,也就是說, 隻有當 foo.service 完全停止後,才會停止 bar.service 單元。 注意,此二選項僅用于指定先後順序, 而與 Requires=, Wants=, BindsTo= 這些選項沒有任何關系。 不過在實踐中也經常遇見将某個單元同時設定到 After= 與 Requires= 選項中的情形。 可以多次使用此二選項,以将多個單元添加到清單中。 假定兩個單元之間存在先後順序(無論誰先誰後),并且一個要停止而另一個要啟動,那麼永遠是"先停止後啟動"的順序。 但如果兩個單元之間沒有先後順序,那麼它們的停止和啟動就都是互相獨立的,并且是并行的。 對于不同類型的單元來說,判斷啟動是否已經完成的标準并不完全相同。 特别的,對于設定在 Before=/After= 中的服務單元來說, 隻有在服務單元内配置的所有啟動指令全部都已經被調用,并且對于每一個被調用的指令, 要麼确認已經調用失敗、要麼确認已經成功運作的情況下, 才能認為已經完成啟動。

OnFailure=

接受一個空格分隔的單元清單。 當該單元進入失敗("failed")狀态時, 将會啟動清單中的單元。

Service小節

Type=

設定程序的啟動類型, 必須設為 simple, forking, oneshot, dbus, notify, idle 之一。其中 forking , 表示 ExecStart= 程序将會在啟動過程中使用 fork() 系統調用。 這是傳統UNIX守護程序的經典做法。 也就是當所有的通信管道都已建好、啟動亦已成功之後, 父程序将會退出,而子程序将作為該服務的主程序繼續運作。 對于此種程序, 建議同時設定 PIDFile= 選項, 以幫助 systemd 準确定位該服務的主程序, 進而加快後繼單元的啟動速度。

ExecStart=

在啟動該服務時需要執行的指令行(指令+參數)。

ExecReload=

這是一個可選的指令, 用于設定當該服務被要求重新載入配置時所執行的指令行。

ExecStop=

這是一個可選的指令, 用于設定當該服務被要求停止時所執行的指令行。

過程

1、建立service檔案

建立檔案并儲存

vim /usr/lib/systemd/system/jws.service
           

内容如下

[Unit] 
Description=Jexus web service 
Documentation=http://www.jexus.org 
Wants=network-online.target 
After=network-online.target 
 
[Service] 
User=root 
Group=root 
Type=forking 
ExecStart=/usr/jexus/jws start 
ExecStop=/usr/jexus/jws stop 
ExecReload=/usr/jexus/jws restart 
 
[Install] 
WantedBy=multi-user.target
           

2、嘗試啟動

systemctl start jws
           

檢視狀态

● jws.service - Jexus web service
   Loaded: loaded (/usr/lib/systemd/system/jws.service; disabled)
   Active: active (running) since Tue 2018-07-24 12:36:56 CST; 9s ago
     Docs: http://www.jexus.org
  Process: 26123 ExecStart=/usr/jexus/jws start (code=exited, status=0/SUCCESS)
 Main PID: 26126 (JwsMain)
   CGroup: /system.slice/jws.service
           ├─26126 mono /usr/jexus/jws.exe
           ├─26141 jexus: log service jwsLog.exe
           ├─26149 jexus: httpd worker jwsHttpd.exe
           └─26156 jexus: asp state service jwsState.exe

Jul 24 12:36:56 DynamicSvc-DEV jws[26123]: Starting ... OK
Jul 24 12:36:56 DynamicSvc-DEV systemd[1]: Started Jexus web service.

           

設定開啟自啟

systemctl enable jws
           
Synchronizing state for jws.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d jws defaults
Executing /usr/sbin/update-rc.d jws enable
Created symlink from /etc/systemd/system/multi-user.target.wants/jws.service to /usr/lib/systemd/system/jws.service.

           

引用

systemd 中文手冊 譯者:金步國

繼續閱讀