linuxbashdbusinit.d

How to set the enviroment variables of the session DBus when starting in an init script?


I like to make sure that the DBus in session mode is running before starting my Application deamon. The sh script under /etc/init.d/ looks like:

#!/bin/sh

### BEGIN INIT INFO
# Provides:           myAppD
# Required-Start:     $local_fs $syslog mountkernfs
# Required-Stop:      $local_fs $syslog mountkernfs
# Default-Start:      2 3 4 5
# Default-Stop:       0 1 6
# Short-Description:  Starts myApp
### END INIT INFO

# Source function library.
. /etc/init.d/functions

start() {
    echo Starting myApp

        # start the dbus as session bus and save the enviroment vars
        if [ -z ${DBUS_SESSION_BUS_PID+x} ]; then
                echo start session dbus ...
                eval $(/usr/bin/dbus-launch --sh-syntax)
                echo session dbus runs now at pid=${DBUS_SESSION_BUS_PID}
        else
                echo session dbus runs at pid=${DBUS_SESSION_BUS_PID}
        fi

    pgrep myApp
    if [ "$?" = "0" ]
    then
        echo myApp already running
        exit 0
    fi
    myApp
    echo myApp started successfully
}

stop() {
    echo Stopping myApp
    kill -SIGHUP `pgrep myApp`
}

status() {
    pgrep myApp > /dev/null && echo running
    pgrep myApp > /dev/null || echo stopped
}

case "$1" in
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       status
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0

The script works fine. But the global environment variables(DBUS_SESSION_BUS_PID, DBUS_SESSION_BUS_ADDRESS) are not set globally. I found out that service has some constrains regarding environment variables.

My script is executed via the System V init system. When running it at the console the environment variables are not set as well.

Any ideas how to solve that problem?


Solution

  • This problem can be overcome by setting the enviroment variables direct for the process:

    #!/bin/sh
    
    ### BEGIN INIT INFO
    # Provides:           myApp
    # Required-Start:     $local_fs $syslog mountkernfs
    # Required-Stop:      $local_fs $syslog mountkernfs
    # Default-Start:      2 3 4 5
    # Default-Stop:       0 1 6
    # Short-Description:  Starts myApp
    ### END INIT INFO
    
    # Source function library.
    . /etc/init.d/functions
    
    start() {
        echo Starting myApp Deamon
        if [ -e "/var/run/dbus/sessionbus.pid" ];then
                    DBUS_SESSION_BUS_PID=`cat /var/run/dbus/sessionbus.pid`
        fi
    
        if [ -e "/var/run/dbus/sessionbus.address" ];then
                    DBUS_SESSION_BUS_ADDRESS=`cat /var/run/dbus/sessionbus.address`
        fi
        # start the dbus as session bus and save the enviroment vars
        if [ -z ${DBUS_SESSION_BUS_PID+x} ];then
                echo start session dbus ...
                eval "export $(/usr/bin/dbus-launch)"
                echo "${DBUS_SESSION_BUS_PID}">/var/run/dbus/sessionbus.pid
                echo "${DBUS_SESSION_BUS_ADDRESS}">/var/run/dbus/sessionbus.address
                echo session dbus runs now at pid="${DBUS_SESSION_BUS_PID}"
        else
                echo session dbus runs at pid="${DBUS_SESSION_BUS_PID}"
        fi
    
        pgrep -x myApp
        if [ "$?" = "0" ]
        then
            echo myApp Deamon already running
            exit 1
        fi
        DBUS_SESSION_BUS_ADDRESS=${DBUS_SESSION_BUS_ADDRESS} myApp -d
        echo myApp started successfully
    }
    
    stop() {
        echo Stopping myApp Deamon
        kill -15 `pgrep myApp`
    }
    
    status() {
        pgrep myApp > /dev/null && echo running
        pgrep myApp > /dev/null || echo stopped
    }
    
    case "$1" in
        start)
           start
           ;;
        stop)
           stop
           ;;
        restart)
           stop
           start
           ;;
        status)
           status
           ;;
        *)
           echo "Usage: $0 {start|stop|status|restart}"