如windows的使用Mono在Linux服务的发展?(Windows like services

2019-06-27 15:30发布

我刚刚从.NET开发转移到LINUX MONO发展......我不要有Linux开发更早的体验..

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

  2. 而且是有可能从单C#访问Linux原生API。 (如WINAPI从胜C#调用)..

Answer 1:

  1. 单附带了一个Windows服务兼容的系统,称为单服务。

    • 服务Unix的词是守护进程。 定期守护进程可以/etc/init.d/boot.d中找到并安装到他们都应该由/etc/rc.*目录被符号链接运行的运行级别。
  2. 只要使用的P / Invoke就像你通常会。 您还可以检查出像女妖其他一些简单的基于单项目的源代码,看看他们是如何做到在Linux P /调用。 只要搜索上google.com/codesearch女妖。



Answer 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脚本关闭应用程序,它会杀死的过程,而不是信号,它干净地关闭。



Answer 3:

对于1 - 是的,它有可能在单声道C#创建后台服务。 服务其实是在后台运行,需要从键盘和鼠标没有输入,不输出直接到用户的屏幕上的程序。 创建这样的程序后,你可以只是nohup的./programname运行它与将其设置为工作到后台,而忽略挂起信号(当你登出发送到正在运行的进程)。

如果你想将它更好地整合,那么你必须(根据您选择的Linux发行版),写一些额外的脚本启动,停止,重新启动它,等等。



Answer 4:

至于Linux操作系统(Unix的API),可以使用Mono.UNIX库附带单。 虽然作为一般规则,你应该尽量坚持用便携式解决方案,而不是像Mono.UNix或​​P的东西/调用只要有可能。



文章来源: Windows like services development in LINUX using MONO?