Windows使用MONO的LINUX服务开发?

我刚刚从.net开发转移到LINUX MONO开发…我没有太多的经验与Linux开发更早..

  1. 我有一个需要创build一个后台服务(如Windows服务)在单声道C#..是否有可能..

  2. 是否有可能从mono c#访问LINUX本机API。 (比如winAPI来自win c#的调用)。

Solutions Collecting From Web of "Windows使用MONO的LINUX服务开发?"

  1. Mono附带一个称为单声道服务的Windows服务兼容系统。

    • 用于服务的Unix字是守护程序。 普通守护进程可以在/etc/init.d/中找到,并且通过从/etc/rc.*目录中建立符号链接来安装到运行级别。
  2. 只要像平常一样使用p / invoke即可。 你也可以查看一些其他简单的基于mono的项目,如Banshee的源代码,看看他们如何在Linux上执行p / invokes。 只需在google.com/codesearch上搜索banshee。

我使用脚本,所以我可以捕获退出代码,并使用它来执行自动更新和事情。 如果它崩溃,它也会自动重新启动,并在日志文件的最后x行重新启动时通过电子邮件发送。

/etc/init.d/MyMonoApp

#!/bin/sh #/etc/init.d/MyMonoApp # APP_NAME="MyMonoApp" APP_PATH="/home/mono/MyMonoApp" APP_USER=mono case "$1" in start) echo "Starting $APP_NAME" start-stop-daemon --start \ --background \ --make-pidfile \ --pidfile /var/run/$APP_NAME.pid \ --chuid $APP_USER \ --exec "$APP_PATH/$APP_NAME" ;; stop) echo "Stopping $APP_NAME" start-stop-daemon -o --stop \ --pidfile /var/run/$APP_NAME.pid ;; *) echo "Usage: /etc/init.d/$APP_NAME {start|stop}" exit 1 ;; esac exit 0 

/家庭/单声道/ MyMonoApp

 #!/bin/sh #!/home/mono/MyMonoApp APP_NAME=`basename $0` APP_DIR=`dirname $0` HOSTNAME=`hostname` cd $APP_DIR tail --lines=300 output.log | mail -s "MyMonoApp $HOSTNAME:$APP_NAME STARTED" "me@email.com" exitcode=0 until [ $exitcode -eq 9 ] do startdate="$(date +%s)" /usr/local/bin/mono MyMonoApp.exe $HOSTNAME:$APP_NAME > output.log exitcode=$? enddate="$(date +%s)" echo "EXIT CODE = $exitcode" >> output.log cp -f output.log output.log.1 elapsed_seconds="$(expr $enddate - $startdate)" echo "Elapsed seconds $elapsed_seconds" subject="EXIT CODE: $exitcode" echo "BASH: Exit Code = $exitcode" if [ $exitcode -eq 6 ] #Restart then subject="RESTART" elif [ $exitcode -eq 7 ] #Previous version then subject="PREVIOUS VERSION" cp -fv MyMonoApp.exe_previous MyMonoApp.exe elif [ $exitcode -eq 8 ] #Update then subject="SOFTWARE UPDATE" cp -fv MyMonoApp.exe MyMonoApp.exe_previous mv -fv MyMonoApp.exe_new MyMonoApp.exe elif [ $exitcode -eq 9 ] #Shutdown then subject="SHUTDOWN" fi if [ $elapsed_seconds -ge 10 ] #been running for longer than 10 seconds then tail --lines=300 output.log | mail -s "MyMonoApp $HOSTNAME:$APP_NAME $subject" "me@email.com" sleep 1 # tiny delay to let things settle else sleep 5 # delay to protect against eating the CPU resourses fi done 

注意:如果您使用init.d脚本关闭应用程序,则会终止进程,而不是发出信号干净关闭。

对于1 – 是的,这是可以在单声道c#中创建后台服务。 Service实际上是一个在后台运行的程序,不需要键盘和鼠标的输入,也不会直接输出到用户的屏幕上。 创建这样的程序后,您可以使用nohup ./programname运行它,并将其设置为后台并忽略挂起信号(在注销时发送到正在运行的进程)。

如果你想更好地集成它,那么你必须编写一些额外的脚本停止,启动,重新启动等(取决于你选择的Linux发行版)。

至于LINUX(Unix API),您可以使用mono中包含的Mono.UNIX库 。 尽管通常情况下,您应该尽可能使用便携式解决方案,而不是像Mono.UNix或​​p / invoke这样的东西。