如何编码单声道守护进程?
我正在尝试为Linux编写一个Mono C#守护进程。
我想在完成处理时做一个启动和停止操作,而不是仅仅杀死进程。
有没有人有这样的例子?
编辑:我想出了如何在debian中使用start-stop-daemon –background,所以我想我现在就使用它。
编辑:我在java中实现这一点,他们有这个不错的addShutdownHook捕获终止应用程序。 我需要多花一点时间来整理单声道服务的依赖关系,或者find一种方法来捕获应用程序终止。
有SessionEnd事件,但那只适用于服务而不是控制台应用程序
答: 使用mono-service在Linux上打包一个windows服务
您应该实施一项服务并使用单一服务。 谷歌为它,你会发现几个例子。
要以Unix方式接收通知(即使用信号),您希望对计划接收的每个信号使用Mono.Unix.UnixSignal ,然后在一组信号上调用UnixSignal.WaitAny()。
您通常会在单独的线程上执行此操作。
一个简单的方法是监听(本地,高)端口,并从pipe理客户端接收命令,如绑定。
更unix-ish的方式是注册一个信号处理程序使用UnixSignal并正确closures收到一定的信号。 查看单声道常见问题解答,“我可以使用单声道信号处理程序吗? 为警告和一个例子。
狼疮已经find单一服务 ,这是一个使用ServiceProcess
接口的托pipe过程。 可悲的是,这需要设置MONO_DISABLE_SHM
,这会禁用Mono中的某些function,特别是跨进程IPC系统。
Linux下的一个守护进程通常监听信号,比如kill信号,但还有一些守护进程允许它像软重启(在configuration中回读)等等。
通常在/etc/init.d目录中附带一个脚本,用于控制这些守护进程的启动和停止。 通常在/ var / run下创build一个pid文件,该文件保持脚本的进程ID以快速识别进程。
即使在编写Mono的时候,你也会很好地理解你所编写的环境,因为Mono进程或本地进程(例如用C创build的)或脚本没有区别。
戴夫
Miguel de Icaza最近写了一个新的Mono C#交互式shell ,你应该能够很容易地进行daemonize。 Miguel的一些源代码的后续文章显示了如何在其他C#应用程序中包含交互式shell。 它可以作为守护进程的一个很好的起点。
请注意,交互式shell需要单声道版本2.2,尚未发布。 但是,代码在Mono的svn仓库中可用。
大卫是正确的,停止服务是通过一个UNIX信号完成的,你应该使用信号处理程序来捕捉它。
作为替代,我使用一个shell脚本。 它启动我的单声道应用程序,然后当我的应用程序退出(有意或无意),看看我的应用程序已设置的任何返回信号。 这可以用来指示脚本在更新中复制,重新启动或退出。 如果我的应用程序崩溃,没有信号返回,所以脚本将重新启动我的应用程序,并发送给我一个电子邮件与最后几行的控制台输出。
使用MONO在LINUX中查看Windows的服务开发?