52

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

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

有没有人有这方面的例子?

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

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

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

答: 在linux上使用mono-service封装一个windows服务

4

7 回答 7

25

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


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

于 2008-10-19T16:30:08.183 回答
19

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

于 2008-10-11T11:18:29.020 回答
16

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

一种更类似于 unix 的方法是使用UnixSignal注册一个信号处理程序,并在接收到某个信号时正确关闭。请参阅Mono 常见问题解答,“我可以在 Mono 中使用信号处理程序吗?” 警告和示例。

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

于 2008-10-09T14:28:14.953 回答
4

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

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

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

戴夫

于 2008-10-09T14:41:58.887 回答
0

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

请注意,交互式 shell 需要 Mono 版本 2.2,该版本尚未发布。但是,该代码在Mono 的 svn 存储库中可用。

于 2008-10-10T02:59:13.453 回答
0

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

于 2008-10-10T03:27:28.797 回答
0

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

在 LINUX 中使用MONO进行类似 Windows 的服务开发?

于 2010-06-20T12:24:15.780 回答