如何编写 Mono 守护程序

Posted

技术标签:

【中文标题】如何编写 Mono 守护程序【英文标题】:How do I code a Mono Daemon 【发布时间】:2010-09-16 05:38:42 【问题描述】:

我正在尝试为 linux 编写 Mono C# 守护程序。

我想在它完成处理时启动和停止它,而不是仅仅终止进程。

有人有这方面的例子吗?

编辑:我想出了如何在 debian 中使用 start-stop-daemon --background,所以我想我现在就使用它。

编辑:我也在 java 中实现这个,他们有这个很好的 addShutdownHook 可以捕获终止应用程序。我需要花更多的时间来整理单声道服务的依赖关系,或者找到一种方法来捕获应用程序终止。

有 SessionEnd 事件,但这仅适用于服务而不是控制台应用程序

答案: using mono-service to wrap a windows service on linux

【问题讨论】:

我也很想看看这个答案是什么,几个月前我搜索不成功。 单服务使用旧的 garbade 收集器,这是我在 debian 上的 2.10 中的泄漏。所以我将 cron 与 mono-sgen 结合使用。 【参考方案1】:

要以 Unix 方式接收通知,即使用信号,您希望对您计划接收的每个信号使用 Mono.Unix.UnixSignal,然后在信号数组上调用 UnixSignal.WaitAny ()。


您通常会在单独的线程上执行此操作。

【讨论】:

【参考方案2】:

一个简单的方法是侦听(本地,高)端口并从管理客户端接收命令,就像 bind 一样。

一种更类似于 unix 的方式是使用 UnixSignal 访问 register a signal handler 并在接收到特定信号时正确关闭。有关注意事项和示例,请参阅 Mono FAQ, "Can I use signal handlers with Mono?"。

lupus 找到了mono-service,这是一个使用ServiceProcess 接口的托管进程。遗憾的是,这需要设置 MONO_DISABLE_SHM,这会禁用 Mono 中的某些功能,尤其是跨进程 IPC 系统。

【讨论】:

没有IPC应该没问题【参考方案3】:

作为替代方案,我使用 shell 脚本。它启动我的单声道应用程序,然后当我的应用程序退出(有意或无意)时,查看我的应用程序设置的任何返回信号。这可用于指示脚本复制更新、重新启动或退出。如果我的应用程序崩溃,则不会返回任何信号,因此脚本将重新启动我的应用程序并向我发送一封电子邮件,其中包含控制台输出的最后几行。

见Windows like services development in LINUX using MONO?

【讨论】:

【参考方案4】:

您应该实现一个服务并使用单一服务。谷歌一下,你会找到几个例子。

【讨论】:

如果示例很容易找到,请在此处链接。随着时间的推移,对 Google 的引用相当不稳定。 我发现编写控制台应用程序更容易,因为在 Linux 中后台运行应用程序很简单——这使它成为一个“守护进程”。 但是,如果您已经 mkbundle'd 您的 Mono 应用程序,这将如何工作? 只为后代。这是您如何使用 POSIX(unix 样式服务)github.com/ServiceStack/ServiceStack/wiki/… 这是您如何构建在 Unix 上运行的 windows 类型服务***.com/questions/15359190/… 我实现了 Windows 服务应用程序,并在 Ubuntu 上运行单服务。当我重新启动系统时,我的应用程序停止了,我需要再次启动单服务。这是一些常见的问题吗?有人遇到过这个吗?【参考方案5】:

David 是对的,停止服务是通过 UNIX 信号完成的,您应该使用信号处理程序来捕获它。

【讨论】:

【参考方案6】:

Miguel de Icaza 最近写了一篇关于新的Mono C# interactive shell 的文章,您应该能够轻松地进行守护进程。 Miguel 有一个follow-up article,其中包含一些源代码,展示了如何在其他 C# 应用程序中包含交互式 shell。它可以作为你的守护进程的一个很好的起点。

请注意,交互式 shell 需要 Mono 2.2 版,该版本尚未发布。不过,代码在Mono's svn repository 中提供。

【讨论】:

有趣的方法,我正在将它投入生产,所以我只使用发布版本的单声道。【参考方案7】:

Linux 下的守护进程通常会监听信号,例如 kill 信号,但还有其他一些允许它执行诸如软重启(在配置中读回)等操作。

这通常伴随着 /etc/init.d 目录中的脚本,用于控制此类守护程序的启动和停止。通常会在 /var/run 下创建一个 pid 文件,该文件会保留进程 ID,以便脚本快速识别进程。

即使在为 Mono 编码时,您也会很好地了解您正在编码的环境,因为 Mono 进程或本机进程(例如,用 C 语言创建)或脚本之间没有区别。

戴夫

【讨论】:

以上是关于如何编写 Mono 守护程序的主要内容,如果未能解决你的问题,请参考以下文章

如何开始在类 Unix 操作系统(如 Linux)中编写守护进程?

JVM 如何终止守护线程?或如何编写优雅终止的守护线程

如何使用 Mono.Cecil 获取 IL 指令的源代码/行号

用shell写一个守护进程脚本

Android守护进程

C#编写的winform程序使用mono脱离.net框架,调用open方法访问access使程序界面消失