前言
此前,我們通過
在樹莓派上借助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.