Windows使用MONO在LINUX中进行服务开发?

时间:2009-08-03 07:49:19

标签: c# linux mono service

我刚刚从.net开发转移到LINUX MONO开发......我以前对linux开发人员有很多经验..

  1. 我需要在单声道c#中创建后台服务(如Windows服务)..是否可能..

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

4 个答案:

答案 0 :(得分:25)

我使用脚本,因此我可以捕获退出代码并使用它来执行自动更新和事情。如果它崩溃,它也会自动重启,并在用日志文件的最后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 :(得分:17)

  1. Mono附带一个名为mono-service的Windows服务兼容系统。

    • 用于服务的Unix字是守护进程。常规守护进程可以在/etc/init.d/中找到,并通过在/etc/rc.*目录中进行符号链接安装到它们应该运行的运行级别中。
  2. 只需像往常一样使用p / invoke。您还可以查看其他一些基于单声道的简单项目(如Banshee)的源代码,了解它们在Linux上的调用方式。只需在google.com/codesearch上搜索banshee。

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

对于LINUX(Unix api),您可以使用mono附带的Mono.UNIX library。虽然作为一般规则,你应该尽可能坚持使用便携式解决方案而不是像Mono.UNix或​​p / invoke这样的东西。