在启动时运行单声道应用程序而不创建服务

时间:2014-03-11 12:45:40

标签: linux mono debian

我有一个单声道C#mono应用程序,它有一个简单的菜单,甚至不需要输入即可工作。我想要做的是在启动时启动应用程序,而不使用ubuntu的StartUp。我使用raspbian并希望将应用程序作为后台进程启动,而不是服务。

我到目前为止的命令是启动它:

start-stop-daemon --start --quiet --pidfile /home/pi/pid/EDM.pid --exec /home/pi/Mono/EDM.exe --test

我需要的是在操作系统启动时运行此命令。我试过这个剧本:

        #! /bin/sh
    ### BEGIN INIT INFO
    # Provides:          mn
    # Required-Start:    $remote_fs $syslog
    # Required-Stop:     $remote_fs $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Start daemon at boot time
    # Description:       Enable service provided by daemon.
    ### END INIT INFO
    # Author: 
    #
    # Do NOT "set -e"
    # PATH should only include /usr/* if it runs after the mountnfs.sh script
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="Mono Daemon"
    NAME=EDM.exe
    DAEMON=/home/po/Mono/EDM.exe
    PIDFILE=/home/pi/pid/EDM.pid
    SCRIPTNAME=/etc/init.d/mn.sh
    CHUID=pi
    # Exit if the package is not installed
    [ -x "/home/pi/Mono/EDM.exe" ] || exit 0
    # Read configuration variable file if it is present
    #[ -r /etc/default/EDM.exe ] && . /etc/default/EDM.exe

    # Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh
    # Define LSB log_* functions.
    # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
    . /lib/lsb/init-functions
    #
    # Function that starts the daemon/service
    #
    do_start()
    {
       # Return
       #   0 if daemon has been started
       #   1 if daemon was already running
       #   2 if daemon could not be started
       start-stop-daemon --start --quiet --pidfile /home/pi/pid/EDM.pid --exec /home/pi/Mono/EDM.exe --test > /dev/null \
          || return 1
       start-stop-daemon --start --quiet --chuid root --pidfile /home/pi/pid/EDM.pid --exec /home/pi/Mono/EDM.exe -- \
          /home/pi/Mono/EDM.exe_ARGS \
          || return 2
    }
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
       # Return
       #   0 if daemon has been stopped
       #   1 if daemon was already stopped
       #   2 if daemon could not be stopped
       #   other if a failure occurred
       start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile /home/pi/pid/EDM.pid --name EDM.exe
       RETVAL="$?"
       [ "$RETVAL" = 2 ] && return 2
       # Wait for children to finish too if this is a daemon that forks
       # and if the daemon is only ever run from this initscript.
       # If the above conditions are not satisfied then add some other code
       # that waits for the process to drop all resources that could be
       # needed by services started subsequently.  A last resort is to
       # sleep for some time.
       start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec /home/pi/Mono/EDM.exe
       [ "$?" = 2 ] && return 2
       # Many daemons don't delete their pidfiles when they exit.
       rm -f /home/pi/pid/EDM.pid
       return "$RETVAL"
    }
    #
    # Function that sends a SIGHUP to the daemon/service
    #
    do_reload() {
       #
       # If the daemon can reload its configuration without
       # restarting (for example, when it is sent a SIGHUP),
       # then implement that here.
       #
       start-stop-daemon --stop --signal 1 --quiet --pidfile /home/pi/pid/EDM.pid --name EDM.exe
       return 0
    }
    case "$1" in
      start)
       [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "EDM.exe"
       do_start
       case "$?" in
          0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
          2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
       esac
       ;;
      stop)
       [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "EDM.exe"
       do_stop
       case "$?" in
          0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
          2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
       esac
       ;;
      #reload|force-reload)
       #
       # If do_reload() is not implemented then leave this commented out
       # and leave 'force-reload' as an alias for 'restart'.
       #
       #log_daemon_msg "Reloading $DESC" "EDM.exe"
       #do_reload
       #log_end_msg $?
       #;;
      restart|force-reload)
       #
       # If the "reload" option is implemented then remove the
       # 'force-reload' alias
       #
       log_daemon_msg "Restarting $DESC" "EDM.exe"
       do_stop
       case "$?" in
         0|1)
          do_start
          case "$?" in
             0) log_end_msg 0 ;;
             1) log_end_msg 1 ;; # Old process is still running
             *) log_end_msg 1 ;; # Failed to start
          esac
          ;;
         *)
            # Failed to stop
          log_end_msg 1
          ;;
       esac
       ;;
      *)
       #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
       echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
       exit 3
       ;;
    esac
    :

我使用update-rc.d mn默认值,它显示以下错误: 更新的rc.d:

using dependency based boot sequencing
insserv: Script mn is broken: incomplete LSB comment.
insserv: missing `Provides:' entry: please add.
insserv: missing `Required-Start:' entry: please add even if empty.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: missing `Default-Start:'  entry: please add even if empty.
insserv: missing `Default-Stop:'   entry: please add even if empty.
insserv: Default-Start undefined, assuming empty start runlevel(s) for script `mn'
insserv: Default-Stop  undefined, assuming empty stop  runlevel(s) for script `mn'

任何想法怎么做?

1 个答案:

答案 0 :(得分:1)

最后,最好的方法是制作一个运行命令的极其简单的bash脚本:

#!/bin/bash
start-stop-daemon --start --background -m --oknodo --pidfile /home/pi/pid/MonoDaemon.pid --exec /usr/bin/mono -- /home/pi/Mono/EDM.exe

之后我在/etc/init.d/rc.local

中添加了一行
/bin/bash /etc/init.d/mnw