2009-08-03 2 views
24

Я только что переехал из .net развития для развития LINUX MONO ... и я дон имеет большой опыт работы с Linux DEV раньше ..Windows как развитие услуг в LINUX с использованием MONO?

  1. У меня есть требование, чтобы создать фоновую службу (например, услуги окон) в mono C# .. возможно.

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

ответ

17
  1. Моно поставляется с совместимой с Windows системой, называемой моно-сервисом.

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

+0

спасибо eddie за ваш ответ .. okie Я попробую с некоторыми примерами .. – RameshVel

+0

Ссылка устарела, пожалуйста, обновите ее: Ь –

4

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

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

+0

спасибо Senad Uka, u означает, что это будет любое обычное консольное приложение без окон, и оно будет запущено в фоновом режиме с помощью команд LINUX. – RameshVel

2

Что касается LINUX (Unix API), вы можете использовать Mono.UNIX library, который входит в моно. Хотя, как правило, вы должны пытаться использовать переносные решения вместо материалов, таких как Mono.UNix или p/invoke, когда это возможно.

23

Я использую скрипты, поэтому я могу записать код выхода и использовать его для выполнения автоматических обновлений и вещей. Он также перезагружается, если он сбой, и отправляет вам сообщения по электронной почте, когда он перезапускается с последними 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" "[email protected]" 

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" "[email protected]" 
       sleep 1 # tiny delay to let things settle 
     else 
       sleep 5 # delay to protect against eating the CPU resourses 
     fi 


done 

Примечание: если закрыть приложение с помощью сценария init.d, он будет убивать а не сигнализировать об этом, чтобы он был близок.

+0

Удивительно, только то, что мне нужно! Большое спасибо! – VirusX

+0

@FlappySocks сценарий отлично работает, за исключением случаев, когда я останавливаю службу, используя скрипт init.d, она останавливает скрипт, но не останавливает монопроцесс. Любая идея о том, как это исправить? – ColmanJ

Смежные вопросы