Windows like services development in LINUX using MONO? Windows like services development in LINUX using MONO? linux linux

Windows like services development in LINUX using MONO?


I use scripts, so I can capture the exit code and use it to perform automated updates and things. It also restarts itself if it crashes, and e-mails you when it restarts with the last x lines of the log file.

/etc/init.d/MyMonoApp

#!/bin/sh#/etc/init.d/MyMonoApp#APP_NAME="MyMonoApp"APP_PATH="/home/mono/MyMonoApp"APP_USER=monocase "$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    ;;esacexit 0

/home/mono/MyMonoApp

#!/bin/sh#!/home/mono/MyMonoAppAPP_NAME=`basename $0`APP_DIR=`dirname $0`HOSTNAME=`hostname`cd $APP_DIRtail --lines=300 output.log  | mail -s "MyMonoApp $HOSTNAME:$APP_NAME STARTED" "me@email.com"exitcode=0until [ $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        fidone

Note: if you close the app using the init.d script, it will kill the process, rather than signal it to cleanly close.


  1. Mono ships with a Windows Service compatible system called mono-service.

    • The Unix word for service is Daemon. Regular daemons can be found in /etc/init.d/ and are installed into the runlevel they are supposed to run in by being symlinked from /etc/rc.* directories.
  2. Just use p/invoke like you normally would. You can also check out the source code of some other simple mono-based projects like Banshee to see how they do p/invokes on Linux. Just search for banshee on google.com/codesearch.


For 1. - yes it is possible to create background service in mono c#. Service is in fact a program that runs in background takes no input from keyboard and mouse, and does not output to directly to the user's screen. After you create such program you can just run it with nohup ./programname &to set it to work into background and ignore the hangup signal (that is sent to your running processes when you log out).

If you want to integrate it better, then you must write some additional scripts for stopping, starting, restarting it, etc (depending on your chosen linux distribution).