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?
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}"