I found the process I think it should be asking for, and it looks like it should work:
root@wopr:~# cat /proc/1955/environ |tr '\0' '\n'|grep DB
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-wZqbwHsRWt,guid=a017520a52ed70c025d498814bdc07f1
root@wopr:~# su - $XUSER -c "eval export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-wZqbwHsRWt,guid=a017520a52ed70c025d498814bdc07f1; qdbus org.kde.kded"|grep powerdevil
/modules/powerdevil
root@wopr:~#
As a suggestion, the final test should replace 'pidof kded4' with 'ps -efww|grep kded4|grep $XUSER|grep -v grep|grep -v defunct
' or similar.
I do not believe the defunct is the problem, rather there are many kded4's (one for me, one for root, one for every user logged in ?). I've filtered out defunct ones anyway, and also restricted it to the current X user name. This should more reliably locate the one KDE instance we are interested in.
This appears to work:
PIDOFKDE4=`ps -efww|grep kded4|grep $XUSER|grep -v grep|grep -v defunct|tr -s ' '|awk '{print $2}'`
if pidof x $PMS > /dev/null ||
( test "$XUSER" != "" && pidof dcopserver > /dev/null && test -x /usr/bin/dcop && /usr/bin/dcop --user $XUSER kded kded loadedModules | grep -q klaptopdaemon) ||
( test "$XUSER" != "" && test -x /usr/bin/qdbus && test -r /proc/$PIDOFKDE4/environ && su - $XUSER -c "eval $(echo -n 'export '; cat /proc/$PIDOFKDE4/environ |tr '\0' '\n'|grep DBUS_SESSION_BUS_ADDRESS); qdbus org.kde.kded" | grep -q powerdevil) ; then
echo hello
fi
Attached is a a version of powerbtn.sh that works for me.
Someone with more Bash voodoo might want to take a look at this.
Using this version, with a power button press, hibernate and resume betwen the two ls's :
root@wopr:~# ls -lah /tmp/powerbutton.fail
-rw-r--r-- 1 root root 0 2010-05-03 22:01 /tmp/powerbutton.fail
root@wopr:~# date
Tue May 4 23:10:10 BST 2010
root@wopr:~# ls -lah /tmp/powerbutton.fail
-rw-r--r-- 1 root root 0 2010-05-03 22:01 /tmp/powerbutton.fail
root@wopr:~# date
Tue May 4 23:12:20 BST 2010
this indicates the script correctly bailed rather than falling through to the shutdown.
Scratch #11, wasn't running as root, which of course the powerbtn.sh would be :-)
Cut'n'paste tests now show BUS_ADDRESS) ; qdbus org.kde.kded" | grep -q powerdevil
... as before ...
root@wopr:~# getXconsole
root@wopr:~# echo $XUSER
falken
root@wopr:~# test "$XUSER" != "" && pidof dcopserver > /dev/null && test -x /usr/bin/dcop && /usr/bin/dcop --user $XUSER kded kded loadedModules | grep -q klaptopdaemon
root@wopr:~# echo $?
1
root@wopr:~# test "$XUSER" != "" && test -x /usr/bin/qdbus && test -r /proc/$(pidof kded4)/environ && su - $XUSER -c "eval $(echo -n 'export '; cat /proc/$(pidof kded4)/environ |tr '\0' '\n'|grep DBUS_SESSION_
-bash: test: too many arguments
Ahh ha ! That is the line that's meant to spot KDE4 and poke it... it looks like a horrible undocument mess to me though.
root@wopr:~# pidof kded4
14371 2153 1955
root@wopr:~# ps -efww|grep kded4
falken 1955 1 0 May01 ? 00:01:23 kdeinit4: kded4 [kdeinit]
falken 2153 1955 0 May01 ? 00:00:00 [kded4] <defunct>
root 14371 1 0 May03 ? 00:00:02 kdeinit4: kded4 [kdeinit]
root 20826 20690 0 22:43 pts/1 00:00:00 grep kded4
I found the process I think it should be asking for, and it looks like it should work: BUS_ADDRESS= unix:abstract= /tmp/dbus- wZqbwHsRWt, guid=a017520a52 ed70c025d498814 bdc07f1 BUS_ADDRESS= unix:abstract= /tmp/dbus- wZqbwHsRWt, guid=a017520a52 ed70c025d498814 bdc07f1; qdbus org.kde.kded"|grep powerdevil
root@wopr:~# cat /proc/1955/environ |tr '\0' '\n'|grep DB
DBUS_SESSION_
root@wopr:~# su - $XUSER -c "eval export DBUS_SESSION_
/modules/powerdevil
root@wopr:~#
As a suggestion, the final test should replace 'pidof kded4' with 'ps -efww|grep kded4|grep $XUSER|grep -v grep|grep -v defunct
' or similar.
I do not believe the defunct is the problem, rather there are many kded4's (one for me, one for root, one for every user logged in ?). I've filtered out defunct ones anyway, and also restricted it to the current X user name. This should more reliably locate the one KDE instance we are interested in.
This appears to work:
PIDOFKDE4=`ps -efww|grep kded4|grep $XUSER|grep -v grep|grep -v defunct|tr -s ' '|awk '{print $2}'`
if pidof x $PMS > /dev/null || PIDOFKDE4/ environ && su - $XUSER -c "eval $(echo -n 'export '; cat /proc/$ PIDOFKDE4/ environ |tr '\0' '\n'|grep DBUS_SESSION_ BUS_ADDRESS) ; qdbus org.kde.kded" | grep -q powerdevil) ; then
( test "$XUSER" != "" && pidof dcopserver > /dev/null && test -x /usr/bin/dcop && /usr/bin/dcop --user $XUSER kded kded loadedModules | grep -q klaptopdaemon) ||
( test "$XUSER" != "" && test -x /usr/bin/qdbus && test -r /proc/$
echo hello
fi
Attached is a a version of powerbtn.sh that works for me.
Someone with more Bash voodoo might want to take a look at this.
Using this version, with a power button press, hibernate and resume betwen the two ls's : n.fail n.fail n.fail n.fail
root@wopr:~# ls -lah /tmp/powerbutto
-rw-r--r-- 1 root root 0 2010-05-03 22:01 /tmp/powerbutto
root@wopr:~# date
Tue May 4 23:10:10 BST 2010
root@wopr:~# ls -lah /tmp/powerbutto
-rw-r--r-- 1 root root 0 2010-05-03 22:01 /tmp/powerbutto
root@wopr:~# date
Tue May 4 23:12:20 BST 2010
this indicates the script correctly bailed rather than falling through to the shutdown.