.Net Core Windows 系統服務,之前已經寫過了,但是,對于Linux的系統服務,卻沒有寫過,主要是因為,大部分Linux的.Net服務都直接Docker了,當然,不排除有這種使用的,可能搞成啟動執行了,也有可能用守護進程的方式搞,但是,Systemd這種系統服務的方式,還是十分推薦的。
那么就寫一篇基于Linux Systemd 系統服務的案例
創建.Net 6 WorkServer

我這里選了不使用.NET 6 特有的統一命名空間方式,就以舊方式編碼。

默認創建完,是這個樣子的

添加Systemd 系統服務
Install-Package?Microsoft.Extensions.Hosting.Systemd
然后,修改 Program方法為以下的方法,主要是增加了UseSystemd服務
public?class?Program
{public?static?void?Main(string[]?args){IHost?host?=?Host.CreateDefaultBuilder(args).UseSystemd()//新增的?.UseSystemd()服務.ConfigureServices(services?=>{services.AddHostedService<Worker>();}).Build();host.Run();}
}
修改WorkServer邏輯
public?class?Worker?:?BackgroundService
{private?readonly?ILogger<Worker>?_logger;public?Worker(ILogger<Worker>?logger){_logger?=?logger;Log.Info($"后臺服務初始化!");}protected?override?async?Task?ExecuteAsync(CancellationToken?stoppingToken){_?=?Task.Run(async?()?=>{while?(!stoppingToken.IsCancellationRequested){Log.Info($"后臺服務運行:?{DateTime.Now}");await?Task.Delay(1000,?stoppingToken);}},?stoppingToken);await?Task.CompletedTask;}public?override?Task?StopAsync(CancellationToken?cancellationToken){base.StopAsync(cancellationToken);Log.Info("系統服務停止!");return?Task.CompletedTask;}
}
Linux 執行腳本
因為我感覺敲命令,老麻煩了(用慣了Windows),所以,還是簡單點,提供了一些命令的腳本
WorkerServiceDemo.service
這個是Linux系統服務的標準名稱,后綴是固定的.service
[Unit]
Description=?WorkerServiceDemo[Service]
Type=notify
ExecStart=/usr/bin/dotnet??/home/kesshei/Desktop/WorkerServiceDemo/WorkerServiceDemo.dll[Install]
WantedBy=multi-user.target
initserver.sh
初始化服務,也叫安裝服務,目的是把上面的 WorkerServiceDemo.service 服務文件拷貝到 /etc/systemd/system 系統服務路徑下
系統服務下的服務還是挺多的

#!/bin/bash
ServerPath='/etc/systemd/system'
FileName='WorkerServiceDemo.service'chmod?+x?start.sh
chmod?+x?stop.sh
chmod?+x?uninstallService.shcp?$FileName?$ServerPath/$FileName
echo?'copy?success'
./start.sh
echo?'Server?Init?Success'
這個腳本,順便把其他的sh授權了,所以, initserver.sh 文件要自己先給它授權,要不然,用不了 chmod +x initserver.sh 即可。
start.sh
啟動服務
#!/bin/bash
sudo?su?-?<<EOF
systemctl?daemon-reload
systemctl?start?WorkerServiceDemo.service
systemctl?enable?WorkerServiceDemo.service
echo?'Server?start?Success'
EOF
stop.sh
停止服務
#!/bin/bash
sudo?su?-?<<EOF
systemctl?stop?WorkerServiceDemo.service
systemctl?disable?WorkerServiceDemo.service
echo?'Server?stop?Success'
EOF
uninstallService.sh
卸載服務,基本與安裝服務相反的方向
#!/bin/bash
sudo?su?-?<<EOF
systemctl?stop?WorkerServiceDemo.service
systemctl?disable?WorkerServiceDemo.service
rm?/etc/systemd/system/WorkerServiceDemo.service
systemctl?daemon-reloadecho?'uninstallserver?success'
EOF
項目部署到Linux下
我目前使用的linux是 Ubantu 18.4,但是,命令應該是類似的。
我直接復制Bin目錄下的項目到Linux上
我到腳本目錄下 /home/kesshei/Desktop/WorkerServiceDemo/Script
執行第一個命令
chmod?+x?initserver.sh
執行第二個命令
sudo?./initserver.sh
然后 輸出,當然,也會讓你輸入root的密碼
copy?success
Created?symlink?/etc/systemd/system/multi-user.target.wants/WorkerServiceDemo.service?→?/etc/systemd/system/WorkerServiceDemo.service.
Server?start?Success
Server?Init?Success
沒有啥異常,就說明,服務啟動OK了。
同時,也要查看服務的日志目錄是否有日志,來查看服務是否正常
下面這個路徑:
/home/kesshei/Desktop/WorkerServiceDemo/Logs
我這邊已經有了一個文件了

也看到日志內容了。
停止服務
./stop.sh
輸出以下內容
Removed?/etc/systemd/system/multi-user.target.wants/WorkerServiceDemo.service.
Server?stop?Success
說明正常
同時也看到了,停止服務的消息,跟我們的業務邏輯是一致的。

啟動服務
./start.sh
輸出以下內容
Created?symlink?/etc/systemd/system/multi-user.target.wants/WorkerServiceDemo.service?→?/etc/systemd/system/WorkerServiceDemo.service.
Server?start?Success
說明正常
同時也看到了,啟動服務的消息,跟我們的業務邏輯也是一致的。

重啟系統后
可以看到,它自己是啟動服務的。

總結
至此,Windows的系統服務和Linux的系統服務兩種原生實現方式都實現了。
還是很不錯的說。
代碼地址
https://github.com/kesshei/WorkerServiceDemo.git
https://gitee.com/kesshei/WorkerServiceDemo.git
閱
一鍵三連呦!,感謝大佬的支持,您的支持就是我的動力!