前言
此前介评,我們通過在樹莓派上借助Mono + Jexus 布署 .Net 4.0 WebForm應(yīng)用爬舰,簡單介紹了如何在樹莓派上布署 Jexus,并承載一個(gè)Asp.Net WebForm應(yīng)用情屹,但現(xiàn)在問題又來了垃你,一不小心停電重啟后,Jexus 卻沒有啟動(dòng)皆刺,而rc.local的啟動(dòng)方式屬于一次性的芹橡,無法通過統(tǒng)一的命令控制望伦,對(duì)于官方介紹上說的jws.start煎殷,請?jiān)徫覜]找到(手動(dòng)瀑布汗)豪直。
目標(biāo)
1弓乙、通過systemd管理jws服務(wù)钧惧,使其能通過systemctl控制啟動(dòng)、停止懈玻、重啟涂乌。
2英岭、使jws能夠開機(jī)自動(dòng)啟動(dòng)
名詞
systemd
systemd這一名字源于Unix中的一個(gè)慣例:在Unix中常以“d”作為系統(tǒng)守護(hù)進(jìn)程(英語:daemon诅妹,亦稱后臺(tái)進(jìn)程)的后綴標(biāo)識(shí)漾唉。
systemd 是一個(gè)專用于 Linux 操作系統(tǒng)的系統(tǒng)與服務(wù)管理器赵刑。 當(dāng)作為啟動(dòng)進(jìn)程(PID=1)運(yùn)行時(shí)场刑,它將作為初始化系統(tǒng)運(yùn)行牵现, 也就是啟動(dòng)并維護(hù)各種用戶空間的服務(wù)。
systemd 將各種系統(tǒng)啟動(dòng)和運(yùn)行相關(guān)的對(duì)象科乎, 表示為各種不同類型的單元(unit)茅茂, 并提供了處理不同單元之間依賴關(guān)系的能力捏萍。 而以 .service 為后綴的單元文件令杈, 封裝了一個(gè)被 systemd 監(jiān)視與控制的進(jìn)程逗噩。
單元文件中的 [Unit] 小節(jié) 包含與單元類型無關(guān)的通用信息跌榔,服務(wù)單元(.service)文件必須包含一個(gè) [Service] 小節(jié)僧须。
Unit小節(jié)
Description=
對(duì)單元進(jìn)行簡單描述的字符串。 用于UI中緊跟單元名稱之后的簡要描述文字柑蛇。 例如 "Apache2 Web Server"
Documentation=
一組用空格分隔的文檔URI列表耻台, 這些文檔是對(duì)此單元的詳細(xì)說明空另。 可接受 "http://", "https://", "file:", "info:", "man:" 五種URI類型。
Wants=
此選項(xiàng)是 Requires= 的弱化版摄杂。 當(dāng)此單元被啟動(dòng)時(shí),所有這里列出的其他單元只是盡可能被啟動(dòng)循榆。 但是析恢,即使某些單元不存在或者未能啟動(dòng)成功, 也不會(huì)影響此單元的啟動(dòng)秧饮。 推薦使用此選項(xiàng)來設(shè)置單元之間的依賴關(guān)系映挂。
Before=, After=
強(qiáng)制指定單元之間的先后順序,接受一個(gè)空格分隔的單元列表盗尸。 假定 foo.service 單元包含 Before=bar.service 設(shè)置柑船, 那么當(dāng)兩個(gè)單元都需要啟動(dòng)的時(shí)候, bar.service 將會(huì)一直延遲到 foo.service 啟動(dòng)完畢之后再啟動(dòng)泼各。 注意鞍时,停止順序與啟動(dòng)順序正好相反,也就是說, 只有當(dāng) bar.service 完全停止后逆巍,才會(huì)停止 foo.service 單元蒸苇。 After= 的含義與 Before= 正好相反味咳。 假定 foo.service 單元包含 After=bar.service 設(shè)置全陨, 那么當(dāng)兩個(gè)單元都需要啟動(dòng)的時(shí)候, foo.service 將會(huì)一直延遲到 bar.service 啟動(dòng)完畢之后再啟動(dòng)。 注意替久,停止順序與啟動(dòng)順序正好相反,也就是說, 只有當(dāng) foo.service 完全停止后,才會(huì)停止 bar.service 單元怖竭。 注意,此二選項(xiàng)僅用于指定先后順序允趟, 而與 Requires=, Wants=, BindsTo= 這些選項(xiàng)沒有任何關(guān)系分唾。 不過在實(shí)踐中也經(jīng)常遇見將某個(gè)單元同時(shí)設(shè)置到 After= 與 Requires= 選項(xiàng)中的情形弧蝇。 可以多次使用此二選項(xiàng)睦授,以將多個(gè)單元添加到列表中。 假定兩個(gè)單元之間存在先后順序(無論誰先誰后)疗隶,并且一個(gè)要停止而另一個(gè)要啟動(dòng),那么永遠(yuǎn)是"先停止后啟動(dòng)"的順序坚弱。 但如果兩個(gè)單元之間沒有先后順序输虱,那么它們的停止和啟動(dòng)就都是相互獨(dú)立的蚕钦,并且是并行的。 對(duì)于不同類型的單元來說,判斷啟動(dòng)是否已經(jīng)完成的標(biāo)準(zhǔn)并不完全相同。 特別的迹蛤,對(duì)于設(shè)置在 Before=/After= 中的服務(wù)單元來說陋桂, 只有在服務(wù)單元內(nèi)配置的所有啟動(dòng)命令全部都已經(jīng)被調(diào)用,并且對(duì)于每一個(gè)被調(diào)用的命令, 要么確認(rèn)已經(jīng)調(diào)用失敗鞍恢、要么確認(rèn)已經(jīng)成功運(yùn)行的情況下蟆炊, 才能認(rèn)為已經(jīng)完成啟動(dòng)肩祥。
OnFailure=
接受一個(gè)空格分隔的單元列表疾层。 當(dāng)該單元進(jìn)入失敗("failed")狀態(tài)時(shí)痛黎, 將會(huì)啟動(dòng)列表中的單元杀捻。
Service小節(jié)
Type=
設(shè)置進(jìn)程的啟動(dòng)類型垢袱, 必須設(shè)為 simple, forking, oneshot, dbus, notify, idle 之一涌韩。其中 forking 擎淤, 表示 ExecStart= 進(jìn)程將會(huì)在啟動(dòng)過程中使用 fork() 系統(tǒng)調(diào)用席吴。 這是傳統(tǒng)UNIX守護(hù)進(jìn)程的經(jīng)典做法量承。 也就是當(dāng)所有的通信渠道都已建好忧风、啟動(dòng)亦已成功之后, 父進(jìn)程將會(huì)退出,而子進(jìn)程將作為該服務(wù)的主進(jìn)程繼續(xù)運(yùn)行删壮。 對(duì)于此種進(jìn)程菱涤, 建議同時(shí)設(shè)置 PIDFile= 選項(xiàng)殷勘, 以幫助 systemd 準(zhǔn)確定位該服務(wù)的主進(jìn)程痒玩, 進(jìn)而加快后繼單元的啟動(dòng)速度炉菲。
ExecStart=
在啟動(dòng)該服務(wù)時(shí)需要執(zhí)行的命令行(命令+參數(shù))。
ExecReload=
這是一個(gè)可選的指令, 用于設(shè)置當(dāng)該服務(wù)被要求重新載入配置時(shí)所執(zhí)行的命令行换途。
ExecStop=
這是一個(gè)可選的指令, 用于設(shè)置當(dāng)該服務(wù)被要求停止時(shí)所執(zhí)行的命令行阁最。
過程
1、創(chuàng)建service文件
新建文件并保存
vim /usr/lib/systemd/system/jws.service
內(nèi)容如下
[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、嘗試啟動(dòng)
systemctl start jws
查看狀態(tài)
● 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.
設(shè)置開啟自啟
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.