c# - 在 redhat 7 systemd 中运行 dotnet appname.dll 时如何调试 203/EXEC?
问题描述
已经尝试调试 4 天了。我有一个试图在 Redhat linux 7.1 systemd 中运行的 asp.net core 2 web 应用程序。dll 在我手动运行时工作正常,但在尝试通过 systemd 运行时失败。
systemctl 的输出
web.service - WebServiceLayer 已加载:已加载(/etc/systemd/user/web.service;已启用;供应商预设:>已禁用)
活动:自太阳 2019-04-28 >12:49:01 CDT 以来激活(自动重启)(结果:退出代码);2 秒前
进程:13588 ExecStart=/microsoft/dotnetcore/dotnet /local/lfs1/ServiceLayer/WebServiceLayer/WebServiceLayer.dll (code=exited, status=203/EXEC)
主 PID:13588(代码=退出,状态=203/EXEC)
4 月 28 日 12:49:01 mymachine.net systemd[1]: web.service: 主进程退出,code=exited,status=203/EXEC
4 月 28 日 12:49:01 mymachine.net systemd[1]:单元 web.service 进入失败状态。
4 月 28 日 12:49:01 mymachine.net systemd[1]:web.service 失败。
这是基本服务文件
mymachine home/username $ cat /etc/systemd/user/web.service
[Unit]
Description=WebServiceLayer
After=syslog.target
[Service]
User=serviceUser
Group=serviceUser
PIDFile=/tmp/$i.pid
WorkingDirectory=%h
Environment="PATH=/microsoft/dotnetcore/"
ExecStart="/microsoft/dotnetcore/dotnet /local/lfs1/ServiceLayer/WebServiceLayer/WebServiceLayer.dll"
Restart=always
RestartSec=3
StartLimitBurst=10
StartLimitIntervalSec=0
KillSignal=SIGQUIT
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
作为参考,当我正常启动 dll 时,我没有收到任何错误:
[serviceUser@mymachine]:/microsoft/dotnetcore/dotnet /local/lfs1/ServiceLayer/WebServiceLayer/WebServiceLayer.dll 宿主环境:生产内容根路径:/home/serviceUser 现在监听:“ http://0.0.0.0:7777 " 申请开始。按 Ctrl+C 关闭。
我查看了Fixing a systemd service 203/EXEC failure (no such file or directory)但这对我的问题没有帮助。任何帮助将不胜感激。
.dll 文件中 Program.cs 的代码:
public static void Main(string[] args)
{
// NLog: setup the logger first to catch all errors
var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
logger.Debug("init main");
CreateWebHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
//NLog: catch setup errors
logger.Error(ex, "Stopped program because of exception");
throw;
}
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
NLog.LogManager.Shutdown();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls(urls: "http://mymachine.net:7777")
.UseStartup<Startup>()
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.UseNLog(); // NLog: setup NLog for Dependency injection
}
解决方案
那么从输出中你很难知道发生了什么。我会建议你配置一些额外的日志记录。
首先,您可以将日志记录配置到文本文件以获取更多详细信息。更多信息:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2
之后,您可以在 main 方法中的代码周围放置一个大的 try / catch 并记录异常。
我想到的唯一快速检查是 serviceUser 是否有足够的权限来访问 dll 或配置文件或任何相关的东西?
推荐阅读
- typescript - 打字稿:除非单独添加,否则 Highcharts 不接受系列
- c - 为什么插入函数在这个简单的哈希表实现中不起作用?
- java - 在rest apis(spring)中响应个性化对象的最佳实践是什么
- c# - linq groupby 和最大计数
- ios - 如何在 Swift iOS 中删除 MDM 配置?
- python-3.x - 在 Jupiter notebook 中使用 ams 数学风格
- aws-cdk - (@aws-cdk/pipelines) 应用程序源代码的构建阶段
- javascript - 在 firestore 的新子集合中创建新文档时出错
- html - 如何使用 colspan 属性获取右侧的单元格?
- regex - 正则表达式在 Pythex.com 中有效,但在 pandas 中无效