我正在尝试为Linux编写一个Mono C#守护进程.
当它完成处理而不是仅仅杀死进程时,我想做它的启动和停止.
有没有人有这方面的例子?
编辑:我想出如何在debian中使用start-stop-daemon --background,所以我想我现在就用它.
编辑:我也在java中实现这个,他们有这个很好的addShutdownHook,可以捕获终止应用程序.我需要花费更多的时间来整理单声道服务的依赖关系,或找到一种方法来捕获应用程序终止.
有SessionEnd事件,但这仅适用于服务而非控制台应用程序
嗨,我正在尝试使用mono-service2从visual studio运行一个股票Windows服务项目.我正在使用mono 2.0和编译器在debian上运行它.
gmcs *.cs -pkg:dotnet
Run Code Online (Sandbox Code Playgroud)
我尝试从这开始(我尝试使用-d设置为dir与app和-n,-m设置)
mono-service2 -l:service.lock --debug Program.exe
Run Code Online (Sandbox Code Playgroud)
唯一的代码更改是添加用于测试的writelines
Service1.cs
using System;
using System.ServiceProcess;
namespace spikes
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Console.WriteLine("starting...");
}
protected override void OnStop()
{
Console.WriteLine("stopping....");
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果是这个错误
Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for Mono.Unix.Native.Syscall ---> System.DllNotFoundException: libMonoPosixHelper.so
at (wrapper managed-to-native) Mono.Unix.Native.Syscall:_L_ctermid ()
at Mono.Unix.Native.Syscall..cctor () [0x00000]
--- End of inner exception …Run Code Online (Sandbox Code Playgroud) 我正在使用.NET 3.5编写便携式服务/守护进程,我的Windows服务正在运行,但我想知道单声道端口...
如果我理解正确,单声道服务就是我正在寻找的.这究竟是如何工作的?我假设我的服务中需要单声道兼容代码,对吗?例如,我正在使用SQLite.是否正确,为了使用单声道我应该重构我的代码使用单声道命名空间等,如Mono.Data.SQLite?我还可以使用Settings.settings吗?
另外,我已经读过守护进程没有实现onStart/Stop方法,所以我需要更改我的代码才能在mono/linux下运行吗?即在我的代码中使用这些方法是否可以,并且可以运行ServiceBase.Run()?Mono-service是否适应这些?
如何检测我在mono-service2下运行?(在C#/ .NET 3.5中,在ubuntu 11上运行mono 2.6.7)
Type.GetType("Mono.Runtime")告诉我我正在单声道运行,所以那部分还可以.但是Environment.UserInteractive在单声道下看起来总是假的,所以我很难弄清楚我是否真的在mono-service2下运行 - 没有控制台/终端.
我正在尝试使用单一服务在Linux上运行Windows .NET-4.0服务.它不是用单声道或任何东西编译的.我不是100%它可行,但我想我可以尝试(二进制兼容等,似乎可行吗?).如我错了请纠正我.
我收到错误,它找不到一些dll.他们在系统中,但它没有找到它们.这是一个.
$ ldconfig -p | grep Posix
libMonoPosixHelper.so (libc6,x86-64) => /usr/lib/libMonoPosixHelper.so
Run Code Online (Sandbox Code Playgroud)
我尝试添加路径等但没有变化.
$ MONO_LOG_LEVEL=debug mono-service MyService.exe --debug > output.log
Run Code Online (Sandbox Code Playgroud)
要么
$ MONO_PATH=/usr/lib MONO_LOG_LEVEL=debug mono-service MyService.exe --debug > output.log
Run Code Online (Sandbox Code Playgroud)
或LD_LIBRARY_PATH,这是空的,所以我试过
export LD_LIBRARY_PATH=/usr/lib
Run Code Online (Sandbox Code Playgroud)
在输出中总是这样:
Mono: DllImport attempting to load: 'libMonoPosixHelper.so'.
Mono: DllImport loading library: '/usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/libMonoPosixHelper.so'.
Mono: DllImport error loading library '/usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/libMonoPosixHelper.so: cannot open shared object file: No such file or directory'.
Mono: DllImport loading library: '/usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/libMonoPosixHelper.so'.
Mono: DllImport error loading library '/usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/libMonoPosixHelper.so: cannot open shared object file: No …Run Code Online (Sandbox Code Playgroud) 有没有人使用start-stop-daemon和mono-service2一起成功?我已经和它斗争了几天了,已经有了各种各样的工作,但是没有成功为单声道服务获得一个功能齐全的init脚本.
这是我迄今所学到的:
单声道或单声道服务exe必须命名为变量DAEMON(您不能将您的exe列为DAEMON)
您必须使用--background标志...否则,当从包安装程序执行此脚本时(在我的情况下为deb).安装程序结束时服务终止(与安装程序分叉处理的方式有关...我没有对此进行过多次调查).
我已经成功地在其他脚本中使用mono-service标志列出了pid文件并使用它来停止守护进程,但由于某种原因它在这里不起作用.因此,下面的脚本不会停止服务 - 不知道为什么.开始工作正常.
这是我的部分功能初始化脚本:
#! /bin/sh
### BEGIN INIT INFO
# Provides: ServiceName
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts and Stops Service
# Description: Service start|stop|restart
### END INIT INFO
# Author: Author
#
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Description of the service"
NAME=Service.exe
DAEMONNAME=ServiceDaemon.sh
INSTALLDIR=/usr/sbin/ …Run Code Online (Sandbox Code Playgroud) 基本上我有一个dotnet 4控制台应用程序,我想转换为Linux服务.我已经在最新版本的mono上测试了控制台应用程序,它可以工作.然后我将控制台应用程序转换为Windows服务,并尝试使用mono-service2启动它,但它导致了一些关于未找到图像的错误.它似乎是在谈论单声道图像或一些这样的而不是图像文件,如果这是有道理的.似乎mono-service2是为dotnet 2.0而不是dotnet 4.0构建的,我似乎无法找到dotnet 4.0版本的代码.任何人都可以指出我正确的方向或给我另一种方式来运行我的服务?我真的希望它们在webmin中显示为服务,这样我就可以停止,启动并检查它们在网络上的状态.
我无法发布确切的错误,因为我没有它,但如果有帮助的话,我会在大约6个小时内发布.
我继承了一个使用运行Windows服务的mono的应用程序.所有原始开发人员都不见了.生产版本在linux上使用mono.我正在尝试启动和运行开发环境.我决定使用windows作为运行单声道的基础平台.好吧也许不是最好的想法,因为我当前的问题,但我想尝试在将环境转移到Linux之前了解这个问题.
问题是我无法运行单一服务.我可以使用mono来运行小型winforms应用程序.我的问题与之前的问题答案相同.使用mono-service在Linux上包装Windows服务 然而我无法翻译在Windows环境中做什么的答案.我确信我没有加载DLL的问题.
未处理的异常:System.TypeInitializationException:Mono.Unix.Native.Syscall ---> System.EntryPointNotF oundException的类型初始化程序抛出异常:Mono_Posix_Syscall_L_ctermid at(包装器托管到本机)Mono.Unix.Native.Syscall: _L_ctermid()at Mono.Unix.Native.Syscall..cctor()[0x00000] ---内部异常堆栈跟踪结束---在MonoServiceRunner.Main(System.String [] args)[0x00000]
我添加了monodevelop环境变量并设置为"all"并有一个日志文件.没有文本将记录日志文件.而且我无法获得上面发布的内容.有人能指出我正确的方向.
我用单机服务
mono-service2 -l:lockfile process.exe
Run Code Online (Sandbox Code Playgroud)
它开始服务,一切都很好,但我不得不在源头改变一些东西.所以我重新编译并部署了它.我通过跑步杀了这项服务
kill -9 <pid>
Run Code Online (Sandbox Code Playgroud)
现在我尝试再次运行该服务.但它根本没有开始.这里有什么问题 ?