我有一个 Centos 7 VPS,我在其中发布了一个 .NET Core 应用程序。该解决方案作为服务运行。
它发布在路径:
*/var/opt/MyApp/(All app's files)*
启动时,它会注册一个位置来记录我需要记录的所有信息。日志路径是固定的:
*/var/log/opt/MyApp/(rotated log file)*
我在下面创建了一个服务文件
*/etc/systemd/system/MyApp.service*
如下
[Unit]
Description=Service MyApp
[Service]
WorkingDirectory=/var/opt/MyApp
ExecStart=/usr/bin/dotnet /var/opt/MyApp/MyApp.dll
Restart=always
# Restart service after 10 seconds if dotnet service crashes
RestartSec=10
SyslogIdentifier=MyApp
User=myappbe
Group=myappbe
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
myappbe 用户和组是使用 nologin 使用以下命令创建的:
*useradd -l -r -s /sbin/nologin myappbe*
*usermod -a -G myappbe myappbe*
工作目录和日志位置均由具有 0775 权限的 myappbe 用户和组拥有。运行像这样配置的服务我可以从journalctl看到一个错误:
*Unhandled exception. System.IO.DirectoryNotFoundException: Requested trace logging directory
'/var/log/opt/MyApp/' does not exist*
即使该位置存在并且 myappbe 是所有者。
将服务中的用户和组行更改为:
User=root
Group=root
以 root 身份运行该服务,没有错误。找到路径,我可以看到正在写入的日志。
为什么以非 root 身份运行服务时找不到路径?
编辑*
我尝试评论检查目录是否存在并直接写入日志文件,但出现以下错误:
System.UnauthorizedAccessException:对路径“/var/log/opt/MyApp”的访问被拒绝。
显然,运行该服务的用户对此路径没有权限。但权限是我之前提到的。