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