如何编写Mono守护程序代码

时间:2008-10-09 09:12:52

标签: c# linux mono daemon mono-service

我正在尝试为Linux编写Mono C#守护进程。

我想在完成处理时开始和停止它,而不仅仅是杀死进程。

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

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

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

有SessionEnd事件,但这仅适用于服务而非控制台应用

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

7 个答案:

答案 0 :(得分:25)

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


您通常会在单独的主题上执行此操作。

答案 1 :(得分:19)

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

答案 2 :(得分:16)

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

更多unix-ish方式是使用register a signal handler UnixSignal并在接收某个信号时正确关闭。有关警告和示例,请参阅Mono FAQ, "Can I use signal handlers with Mono?"

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

答案 3 :(得分:4)

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

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

即使编写Mono代码,您也可以很好地理解编码环境,因为Mono进程或本机进程(例如在C中创建)或脚本之间没有区别。

戴夫

答案 4 :(得分:0)

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

请注意,交互式shell需要Mono 2.2版,尚未发布。但是,代码在Mono's svn repository中可用。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

请参阅Windows like services development in LINUX using MONO?