开机自动启动,折腾了一小天,设置/etc/init.d/ 、update-rc.d,可能刚开始用,经验不多吧,尝试多种方式我的服务怎么都启动不起来,根据之前nginx和redis的自动启动经验,使用systemd管理服务,systemd 是 Linux 操作系统的系统和服务管理器,注意全部是小写,systemd是init和SystemV的替代者,查询了微软官方关于NetCore自动启动配置文档:
将 ASP.NET Core应用程序配置为自动启动 - ASP.NET Core | Microsoft Learn
ini文件内容如下:
[Unit]
Description=Example .NET Web API App running on Ubuntu
[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
以下是此内容的一些关键说明:
WorkingDirectory 是发布应用程序的目录。
ExecStart 是启动应用程序的实际命令。
Restart=always 是自动的。 如果由于某种原因(无论是手动还是由于崩溃)而停止,则始终会启动此过程。
RestartSec=10 也是自动的。 进程停止后,将在经过 10 秒后启动。
SyslogIdentifier 很重要。 它表示“系统日志标识符”。 有关守护程序的信息记录在此名称下的系统日志中。 还可以使用此标识符查找进程的 PID。
User 是管理服务的用户。 它应存在于系统中,并具有相应的应用程序文件所有权。
可以在服务文件中设置任意数量的环境变量。
注意:该 www-data 用户是系统中的特殊用户。 可以使用此帐户。 你也可以创建一个新用户,用于在 Linux 中练习用户权限。 但是,如果不想创建另一个 Linux 用户,则可以使用 www-data 它。
查询系统用户命令:
root@xxx-pc:~# cat /etc/passwd | cut -f -1 -d:,如下图:
将以上内容定义为dotnet6.service内容修改后如下:
[Unit]
Description=.NET6 Web API App running
[Service]
WorkingDirectory=/usr/local/HF.WebApiServiceRelease6-Linux/HF.WebApiServiceRelease6-Linux
ExecStart=/usr/bin/dotnet /usr/local/HF.WebApiServiceRelease6-Linux/HF.WebApiServiceRelease6-Linux/HF.WebApiService.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet6-WebAPI
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
上传至银河麒麟V10 SP1服务器,使用命令将文件复制到:/lib/systemd/system,此目录实际映射为/usr/lib/systemd/system目录:
cp /home/dotnet6.service /lib/systemd/system/dotnet6.service
复制成功后使用命令启动,如果不是root管理员,首先获取root管理员权限 :
root@xxx-pc:~# sudo su - 会提示输入密码:
获得权限后:
sudo systemctl daemon-reload
sudo systemctl enable dotnet6.service
sudo systemctl start dotnet6.service
sudo systemctl status dotnet6.service
按步骤执行上面命令:
依然没有成功,一脸蒙圈,错在哪了,又开始了翻找文档,网络上大部将dotnet根目录设置为/usr/bin/dotnet 导致配置文件 ExecStart=/usr/bin/dotnet 实际是不正确的,使用命令:which dotnet
这才是dotnet运行目录,修改设置后,重新执行上面按顺序systemctl的命令,依然启动失败,经过一番摸索查找后发现:
Environment设置后不会读取appsettings.json配置文件,程序会找appsettings.Production.json文件,于是将这两句注释,最终内容如下:
[Unit]
Description=.NET6 Web API App running
[Service]
WorkingDirectory=/usr/local/HF.WebApiServiceRelease6-Linux/HF.WebApiServiceRelease6-Linux
ExecStart=/home/dotnet/dotnet /usr/local/HF.WebApiServiceRelease6-Linux/HF.WebApiServiceRelease6-Linux/HF.WebApiService.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet6-WebAPI
User=www-data
#Environment=ASPNETCORE_ENVIRONMENT=Production
#Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
#Environment=DOTNET_ROOT=/home/dotnet
[Install]
WantedBy=multi-user.target
再按顺序执行命令:
sudo systemctl daemon-reload
sudo systemctl enable dotnet6.service
sudo systemctl start dotnet6.service
sudo systemctl status dotnet6.service
其实我只执行 sudo systemctl daemon-reload 、sudo systemctl status dotnet6.service 服务已经自动启动了:
访问页面服务端地址:
至此,终于折腾完成了。