.NET Coreアプリケーションを公開するCentos 7 VPSがあります。ソリューションはサービスとして実行されます。
次のパスに公開されます。
*/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*
作業ディレクトリとログの場所の両方は、myappbeユーザーと0775権限を持つグループによって所有されます。このように構成されたサービスを実行すると、Journalctlにエラーが表示されます。
*Unhandled exception. System.IO.DirectoryNotFoundException: Requested trace logging directory
'/var/log/opt/MyApp/' does not exist*
場所が存在し、myappbeが所有者である場合も同様です。
サービスのユーザーとグループの行を次のように変更します。
User=root
Group=root
サービスをrootとして実行するとエラーはありません。パスが見つかり、ログが記録されていることがわかります。
ルート以外のユーザーとしてサービスを実行してもパスが見つからないのはなぜですか?
編集する*
ディレクトリが存在することを確認し、ログファイルに直接書き込むためにコメントを付けましたが、次のエラーが発生します。
System.UnauthorizedAccessException: '/var/log/opt/MyApp' パスへのアクセスが拒否されました。
明らかに、サービスを実行しているユーザーにはこのパスに対する権限がありません。しかし、権限は前述のものです。