首页 文章

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

提问于
浏览
24

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

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

  • 是否可以从单声道c#访问LINUX本机API . (比如来自win c#的winAPI调用)

4 回答

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

    • 用于服务的Unix字是守护进程 . 常规守护进程可以在/etc/init.d/中找到,并通过从/etc/rc.*目录中进行符号链接安装到它们应该运行的运行级别中 .

    • 只需像往常一样使用p / invoke . 您还可以查看一些其他简单的基于单声道的项目(如Banshee)的源代码,了解它们如何在Linux上进行p /调用 . 只需在google.com/codesearch上搜索banshee即可 .

  • 17

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

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

  • 2

    我使用脚本,所以我可以捕获退出代码并使用它来执行自动更新和事情 . 如果它崩溃,它也会重新启动,并在用日志文件的最后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脚本关闭应用程序,它将终止进程,而不是发出信号干净关闭 .

  • 4

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

相关问题