Ubuntu Linux设置守护进程时出错的解决
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu Linux设置守护进程时出错的解决相关的知识,希望对你有一定的参考价值。
Ubuntu系统使用源从7.10升级到8.04后,启动并在用户登录后,界面无响应5分钟左右后,弹出出错信息:启动GNOME设置守护进程时出错
主题、声音或者背景设置等可能不会正常工作。
最后的错误信息是:
Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
GNOME在您下次登录时仍将试图重启动设置守护进程
解决方法:
在启动至将要登陆到用户桌面时, 按Ctrl + Alt + F1 进入命令行模式,作如下修改:
sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
注意“eth0”最后一个字为零,而非英文字母“欧”,完成键盘输入后,按ESC,输入:
wq!
保存并退出文件的修改,使用如下命令重新启动网络服务:
sudo /etc/init.d/networking restart
或者:
sudo ifdown eth0
或者:
sudo ifup eth0
重启系统,发现问题已经解决,锐捷要求的动态ip也可以获取到,可顺利上线了。 参考技术A 没有错误信息,神仙也不知道问题答案
优雅地杀死在 Linux 上运行的 .NET Core 守护进程
【中文标题】优雅地杀死在 Linux 上运行的 .NET Core 守护进程【英文标题】:Killing gracefully a .NET Core daemon running on Linux 【发布时间】:2016-11-12 11:50:00 【问题描述】:我创建了一个 .NET Core 控制台应用程序,在 Ubuntu 14.04 机器上作为守护程序运行。
我想停止服务而不强制它,能够处理终止事件。
我怎样才能做到这一点?
【问题讨论】:
愿意分享您的代码 - 将 .NET Core 控制台应用程序转变为 Ubuntu 守护程序? 我唯一做的就是从 GitHub 复制一个默认的初始化脚本;开始函数调用dotnet library.dll
和停止函数:kill dotnet library.dll
。
【参考方案1】:
您希望能够向正在运行的进程发送 SIGTERM:
kill <PID>
并且进程应该处理它以正确关闭。
不幸的是,.NET Core 没有很好的文档记录,但它能够处理 Unix 信号(与 Mono 的方式不同)。 GitHub issue
如果您将 Ubuntu 与 Upstart 一起使用,您需要有一个在停止请求时发送 kill 信号的初始化脚本:Example init script
将依赖项添加到您的 project.json:
"System.Runtime.Loader": "4.0.0"
这将为您提供 AssemblyLoadContext。
然后你就可以处理 SIGTERM 事件了:
AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;
注意:
使用 Mono,正确的处理方式是通过 UnixSignal:Mono.Unix.Native.Signum.SIGTERM
编辑:
正如@Marc 在他最近的回答中指出的那样,这不再是实现这一目标的最佳方式。从 .NET Core 2.0 开始,AppDomain.CurrentDomain.ProcessExit
是受支持的事件。
【讨论】:
如果应用程序优雅地自行停止,这将起作用。但是如果调用 kill 命令,它不会触发“AssemblyLoadContext.Default.Unloading”。我做错了吗? 您使用的是哪个版本的 .NET Core?您是否正在修改加载上下文? 版本:1.0.0-preview2-003121 ...我还注意到,当我运行“dotnet run”时,它会启动 2 个进程。我认为这是它不起作用的原因,因为它会杀死其中一个进程,但不会同时杀死两个进程。 尝试进入已发布的 DLL 文件夹并使用:dotnet <DllName>.dll
(不运行)运行应该只运行一个进程,您可以尝试杀死那个进程。
谢谢。是的,这与我的工作方式相似。我唯一的区别是“dotnet exec 自一年前@Stefano 的回答以来,.NET Core 已经有了很大的发展。在 .NET Core 2.0 中,您现在可以使用众所周知的 AppDomain.CurrentDomain.ProcessExit
事件而不是 AssemblyLoadContext.Default.Unloading
。它适用于 Linux 上的控制台应用程序,也适用于 Docker。
【讨论】:
我做了一个简单的例子来说明如何处理这个事件:github.com/rquackenbush/DotNetSigTermTestAppDomain.CurrentDomain.ProcessExit
只允许 2 秒的清理时间,并且无法使用托管代码覆盖它。
@Parag 我认为您误读了文档,或者它已被更改。此时间限制仅在 .NET Framework 中,不在 .NET Core 中。 docs.microsoft.com/en-us/dotnet/api/…
@AndersEmil 我确信它适用于 .net 核心。检查您发送的文档链接中的“适用于”部分。
@Parag 这篇文章是关于 ProcessExit 事件,而不是时间限制。在紫色的注释框中,它清楚地表明 .NET Core 中不存在时间限制,我很惊讶你错过了它。以上是关于Ubuntu Linux设置守护进程时出错的解决的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu12.04下创建了一个守护进程,生成了一个可执行文件,如何让这个可执行文件开机自动运行?