代码之家  ›  专栏  ›  技术社区  ›  RameshVel

使用MONO在LINUX中开发类似Windows的服务?

  •  25
  • RameshVel  · 技术社区  · 15 年前

    我刚从.net开发转到LINUX MONO开发。。。而且我之前在linux开发方面没有太多经验。。

    1. 我需要在mono c#中创建后台服务(如windows服务)。。有可能吗。。

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

    4 回复  |  直到 15 年前
        1
  •  24
  •   FlappySocks    15 年前

    我使用脚本,因此我可以捕获退出代码并使用它执行自动更新和其他操作。如果崩溃,它也会自动重新启动,并在使用日志文件的最后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
    

    /home/mono/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脚本关闭应用程序,它将终止进程,而不是发出信号让它完全关闭。

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

        3
  •  4
  •   Senad Uka    15 年前

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

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

        4
  •  2
  •   Anders Rune Jensen    15 年前

    对于LINUX(Unix api),您可以使用 Mono.UNIX library