在启动应用程序deamon之前,我想确保会话模式下的DBus正在运行。/etc/init.d/下的sh脚本如下所示:
#!/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
剧本写得很好。但是全局环境变量(DBUS_SESSION_BUS_PID、DBUS_SESSION_BUS_ADDRESS)不是全局设置的。我发现服务有一些constrains regarding environment variables。
我的脚本是通过System V init系统执行的。在控制台上运行时,也不会设置环境变量。
有什么办法解决这个问题吗?
最佳答案
可以通过直接为流程设置环境变量来解决此问题:
#!/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}"
关于linux - 在初始化脚本中启动时,如何设置 session DBus的环境变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38505266/