打开配置文件 appsettings.json,将日志文件保存路径中的 \ 改为 /,这是因为 Windows 中使用反斜杠 \ 来表示目录,而 Linux 中使用正斜杠 / 来表示目录。
发布程序
dotnet publish -c Release -r linux-x64 -o c:\test\linux
将文件夹 C:\test\linux 下的文件压缩为 linux.zip。
打开 Xshell 工具,连接到一台 Linux 测试机(我的测试机操作系统为 CentOS 7.3),在测试机上新建 /srv/Worker 目录:
mkdir /srv/Worker
使用 rz 命令将 linux.zip 复制到测试机,然后在测试机上解压 linux.zip 到 /srv/Worker 目录:
unzip linux.zip -d /srv/Worker
为我们的应用程序分配可执行权限,并运行:
# 分配可执行权限
chmod +x /srv/Worker/MyService
# 运行
/srv/Worker/MyService
按下 Ctrl+C 关闭应用,等待关闭前必须完成的任务正常结束后,应用退出。输入 ls /srv/Worker 命令回车,您会看到在该目录下多了一个 Logs 目录,日志文件输出正常。
以上只是以控制台运行,如果需要作为服务,还要执行以下操作。
为了让我们的 Worker 监听来自 Systemd 的启动和停止信号,我们需要添加 Microsoft.Extensions.Hosting.Systemd NuGet 包,然后修改代码
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSystemd() // Sets the host lifetime to Microsoft.Extensions.Hosting.Systemd.SystemdLifetime...
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
})
.UseSerilog(); //将 Serilog 设置为日志提供程序
然后重新发布一遍。
接下来我们需要创建配置文件,将服务的有关信息告知 systemd,以便它知道如何运行此服务。为此,我们需要创建一个 .service 文件,我们将在注册和运行此服务的 Linux 机器上使用该文件。
在我们的项目中创建一个名为 MyService.service 的服务单元配置文件,内容如下
[Unit]
Description=Long running service/daemon created from .NET worker template
[Service]
# The systemd service file must be configured with Type=notify to enable notifications.
Type=notify
# will set the Current Working Directory (CWD). Worker service will have issues without this setting
WorkingDirectory=/srv/Worker
# systemd will run this executable to start the service
ExecStart=/srv/Worker/MyService
# to query logs using journalctl, set a logical name here
SyslogIdentifier=MyService
# Use your username to keep things simple.
# If you pick a different user, make sure dotnet and all permissions are set correctly to run the app
# To update permissions, use 'chown yourusername -R /srv/Worker' to take ownership of the folder and files,
# Use 'chmod +x /srv/Worker/MyService' to allow execution of the executable file
User=yourusername
# This environment variable is necessary when dotnet isn't loaded for the specified user.
# To figure out this value, run 'env | grep DOTNET_ROOT' when dotnet has been loaded into your shell.
Environment=DOTNET_ROOT=/usr/share/dotnet/dotnet
# This gives time to MyService to shutdown gracefully.
TimeoutStopSec=300
[Install]
WantedBy=multi-user.target
使用时应将 User=yourusername 项中的 yourusername 改为具体的 linux 系统的登录名
Systemd 期望所有的配置文件放置在 /etc/systemd/system/ 目录下,我们打开此目录,并使用 rz 命令将服务配置文件复制到 /etc/systemd/system/MyService.service
cd /etc/systemd/system/
rz
然后执行以下命令让 systemd 重新加载配置文件:
systemctl daemon-reload
之后,可以运行以下命令来检查 systemd 是否识别了我们的服务:
systemctl status MyService
结果显示如下:
这表明我们注册的新服务被禁用了,可以通过运行以下命令来启动它:
systemctl start MyService
重新运行 systemctl status MyService 命令查看服务状态,显示如下:
停止服务可以运行以下命令:
systemctl stop MyService
如果您希望该服务在开机时自动启动,那么可以运行以下命令:
systemctl enable MyService
禁用开机自动启动,可以运行以下命令:
systemctl disable MyService
查看服务是否开机自动启动,可以运行以下命令:
systemctl is-enabled MyService
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/51806.html