Windows как разработка сервисов в LINUX с использованием MONO? - PullRequest
25 голосов
/ 03 августа 2009

Я только что перешел от разработки .net к разработке LINUX MONO ... и у меня нет большого опыта работы с linux dev ранее ..

  1. У меня есть требование для создания фоновой службы (например, службы Windows) в моно c # .. это возможно ..

  2. И возможно ли получить доступ к собственным API-интерфейсам LINUX из mono c #. (например, вызовы winAPI из win c #) ..

Ответы [ 4 ]

25 голосов
/ 05 августа 2009

Я использую сценарии, чтобы я мог захватить код завершения и использовать его для выполнения автоматических обновлений и прочего. Он также перезапускается, если происходит сбой, и отправляет вам электронное письмо, когда перезагружается с последними x строками файла журнала.

/ и т.д. / 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, оно остановит процесс, а не выдаст сигнал о его закрытии.

17 голосов
/ 03 августа 2009
  1. Mono поставляется с системой, совместимой с Windows Service, которая называется mono-service.

    • Слово Unix для обозначения сервиса - Daemon. Регулярные демоны можно найти в /etc/init.d/ и установить на уровень выполнения, на котором они должны запускаться с помощью символической ссылки из каталогов /etc/rc.*.
  2. Просто используйте p / invoke, как обычно. Вы также можете проверить исходный код некоторых других простых моно-проектов, таких как Banshee, чтобы увидеть, как они выполняют p / вызывает в Linux. Просто найдите Банши на google.com/codesearch.

4 голосов
/ 03 августа 2009

для 1. - да можно создать фоновый сервис в моно c #. Сервис на самом деле программа, которая работает в фоновом режиме, не требует ввода с клавиатуры и мыши и не выводит непосредственно на экран пользователя. После создания такой программы вы можете просто запустить ее с помощью nohup ./programname & настроить его на работу в фоновом режиме и игнорировать сигнал зависания (который отправляется запущенным процессам при выходе из системы).

Если вы хотите лучше интегрировать его, то вы должны написать несколько дополнительных сценариев для его остановки, запуска, перезапуска и т. Д. (В зависимости от выбранного дистрибутива Linux).

2 голосов
/ 03 августа 2009

Что касается LINUX (Unix api), вы можете использовать библиотеку Mono.UNIX , которая включена в mono. Хотя, как правило, вы должны стараться использовать портативные решения, а не такие вещи, как Mono.UNix или p / invoke, когда это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...