Windows, как развитие услуг в LINUX, используя MONO?
Я только что перешел из .net-разработки в LINUX MONO... и у меня больше опыта с linux dev раньше.
-
У меня есть требование создать фоновый сервис (например, службы windows) в mono С#.. возможно ли это.
-
И можно ли получить доступ к родным API-интерфейсам LINUX с помощью mono С#. (например, winAPI вызывает от win С#).
Ответы
Ответ 1
-
Моно поставляется с совместимой с Windows системой, называемой моно-службой.
- Слово Unix для службы - Daemon. Регулярные демоны можно найти в файле/etc/init.d/и устанавливаются на уровень запуска, на котором они должны запускаться, будучи привязаны к каталогам /etc/rc.*.
-
Просто используйте p/invoke, как обычно. Вы также можете проверить исходный код некоторых других простых моно-проектов, таких как Banshee, чтобы посмотреть, как они p/invokes на Linux. Просто найдите banshee на google.com/codesearch.
Ответ 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" "[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 script, он убьет этот процесс, а не сигнализирует ему о закрытии.
Ответ 3
Для 1. - да, возможно создать фоновое обслуживание в моно С#. Служба на самом деле программа, которая работает в фоновом режиме, не принимает никаких данных с клавиатуры и мыши и не выводит ее непосредственно на экран пользователя.
После создания такой программы вы можете просто запустить ее с nohup./programname &
чтобы он работал в фоновом режиме и игнорировал сигнал зависания (который отправляется на ваши запущенные процессы при выходе из системы).
Если вы хотите лучше интегрировать его, вы должны написать несколько дополнительных скриптов для остановки, запуска, перезапуска и т.д. (в зависимости от выбранного вами дистрибутива Linux).
Ответ 4
Что касается LINUX (Unix api), вы можете использовать Mono.UNIX library, которая включена в моно. Хотя, как правило, вы должны стараться придерживаться портативных решений, а не таких, как Mono.UNix или p/invoke, когда это возможно.