A Windows le gusta el desarrollo de servicios en LINUX usando MONO?


Acabo de pasar del desarrollo.net al desarrollo LINUX MONO... y no tengo mucha experiencia con Linux dev antes..

  1. Tengo un requisito para crear un servicio en segundo plano (como los servicios de Windows) en mono c#.. es posible..

  2. Y es posible acceder a las API nativas de LINUX desde mono c#. (como llamadas WinAPI desde win c#)..

Author: Dykam, 2009-08-03

4 answers

  1. Mono se envía con un sistema compatible con Windows Service llamado mono-service.

    • La palabra Unix para servicio es Daemon. Los demonios regulares se pueden encontrar en /etc / init.d / y se instalan en el nivel de ejecución en el que se supone que deben ejecutarse al ser enlazados simbólicamente desde /etc/rc.* Directory.
  2. Simplemente use p / invoke como lo haría normalmente. También puede consultar el código fuente de algunos otros proyectos simples basados en mono como Banshee para ver cómo hacen p / invoca en Linux. Solo busca banshee en google.com/codesearch.

 17
Author: wm_eddie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-03 08:03:38

Uso scripts, así que puedo capturar el código de salida y usarlo para realizar actualizaciones automatizadas y cosas. También se reinicia si se bloquea, y le envía un correo electrónico cuando se reinicia con las últimas líneas x del archivo de registro.

/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

/ inicio / mono / 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

Nota: si cierra la aplicación usando el init.d script, matará el proceso, en lugar de señalarlo para cerrar limpiamente.

 24
Author: FlappySocks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-05 18:09:39

Para 1. - sí es posible crear un servicio en segundo plano en mono c#. El servicio es, de hecho, un programa que se ejecuta en segundo plano no toma ninguna entrada del teclado y el ratón, y no sale directamente a la pantalla del usuario. Después de crear dicho programa, solo puede ejecutarlo con nohup ./programname & para configurarlo para que funcione en segundo plano e ignore la señal hangup (que se envía a sus procesos en ejecución cuando cierra sesión).

Si desea integrarlo mejor, entonces debe escribir algunos scripts adicionales para detenerlo, iniciarlo, reiniciarlo, etc. (dependiendo de su distribución de linux elegida).

 4
Author: Senad Uka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-03 07:56:26

En cuanto a LINUX (Unix api), puede usar el Mono.Biblioteca UNIX que se incluye con mono. Aunque, como regla general, debe tratar de seguir con soluciones portátiles en lugar de cosas como Mono.UNix o p / invoke siempre que sea posible.

 2
Author: Anders Rune Jensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-03 08:22:44