我正在尝试为Linux编写Mono C#守护进程。
我想在完成处理时开始和停止它,而不仅仅是杀死进程。
有没有人有这方面的例子?
编辑:我想出了如何在debian中使用start-stop-daemon --background,所以我想我现在就用它。
编辑:我也在java中实现这个,他们有这个很好的addShutdownHook,可以捕获终止应用程序。我需要花费更多的时间来整理单声道服务的依赖关系,或找到一种方法来捕获应用程序终止。
有SessionEnd事件,但这仅适用于服务而非控制台应用
答案 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脚本。它启动我的单声道应用程序,然后当我的应用程序退出(有意或无意)时,查看我的应用程序设置的任何返回信号。这可用于指示脚本在更新,重新启动或退出时进行复制。如果我的应用程序崩溃,则不会返回任何信号,因此脚本将重新启动我的应用程序并向我发送一封电子邮件,其中包含控制台输出的最后几行。