如何编写单声道守护进程
本文关键字:守护 进程 声道 何编写 单声道 | 更新日期: 2023-09-27 17:47:22
我正在尝试为Linux编写一个Mono C#守护进程。
我想在它完成处理时启动和停止它,而不仅仅是杀死进程。
有人有这方面的例子吗?
编辑:我想出了如何在debian中使用start-stop-daemon --background,所以我想我现在就使用它。
编辑:我也在java中实现了这一点,他们有一个很好的addShutdownHook,可以捕获终止应用程序。我需要花更多的时间来整理单声道服务的依赖关系,或者找到一种方法来捕获应用程序终止。
有 SessionEnd 事件,但这仅适用于服务,不适用于控制台应用
答:使用单体服务在Linux上包装Windows服务
要以Unix方式(即使用信号)接收通知,您需要对计划接收的每个信号使用Mono.Unix.UnixSignal,然后在信号数组上调用UnixSignal.WaitAny()。
您通常会在单独的线程上执行此操作。
你应该实现一个服务并使用单服务。谷歌一下,你会发现几个例子。
一个简单的方法是侦听(本地、高)端口并从管理客户端接收命令,就像 bind 所做的那样。
一种更像 unix 的方法是使用 UnixSignal 注册一个信号处理程序,并在接收到某个信号时正确关闭。请参阅 Mono 常见问题解答,"我可以将信号处理程序与 Mono 一起使用吗?"了解注意事项和示例。
Lupus发现了Mono-Service,这是一个使用ServiceProcess
接口的托管进程。可悲的是,这需要设置MONO_DISABLE_SHM
,这会禁用Mono中的某些功能,特别是跨进程IPC系统。
Linux 下的守护进程通常侦听信号,例如终止信号,但还有其他守护进程允许它执行软重启(在配置中读回)等操作。
通常,这伴随着/etc/init.d 目录中的脚本,用于控制启动和停止此类守护程序。通常,pid 文件是在/var/run 下创建的,该文件保留脚本的进程 ID 以快速识别进程。
即使在为 Mono 编码时,您也会很好地理解您正在编码的环境,因为 Mono 进程或本机进程(例如用 C 语言创建)或脚本之间没有区别。
戴夫
Miguel de Icaza最近写了一篇关于一个新的Mono C#交互式shell的文章,你应该能够足够容易地守护程序。 Miguel 有一篇后续文章,其中包含一些源代码,展示了如何在其他 C# 应用程序中包含交互式 shell。 它可以作为守护程序的良好起点。
请注意,交互式 shell 需要尚未发布的 Mono 版本 2.2。但是,该代码可在Mono的svn存储库中找到。
David 是正确的,停止服务是通过 UNIX 信号完成的,您应该使用信号处理程序来捕获它。
作为替代方案,我使用 shell 脚本。 它启动我的单声道应用程序,然后当我的应用程序退出(有意或无意)时,查看我的应用程序设置的任何返回信号。 这可用于指示脚本在更新中复制、重新启动或退出。 如果我的应用崩溃,则不会返回任何信号,因此脚本将重新启动我的应用,并向我发送一封电子邮件,其中包含控制台输出的最后几行。
看到Windows像使用MONO的LINUX中的服务开发一样吗?