Sie sind nicht angemeldet.

1

10.07.2007, 20:56

ThinkPad Sondertasten mit ACPI: Skriptprobleme

ACPI-Ereignisse (z.B. durch Drücken von Sondertasten wie Fn+F9) lassen sich mit dem Ausführen eines Skripts verbinden. So weit, so gut.

Jetzt habe ich aber einige Befehle in einem Skript, die nicht funktionieren wenn das Skript über das ACPI-Ereignis gestartet wird. Starte ich das Skript manuell als 'root', werden alle Befehle im Skript einwandfrei ausgeführt. Um der Sache auf den Grund zu gehen, habe ich dem Skript, das aufgerufen wird, ein 'whoami' angefügt um zu sehen welcher User die Befehle ausführt. Überraschenderweise war es in beiden Fällen 'root'. Müßte das Skript dann nicht eigentlich auch bei Aufruf durch das ACPI-Ereignis einwandfrei funktionieren?

Um das ACPI-Ereignis Fn+F9 mit einem Skript zu verbinden, habe ich Folgendes in der Datei /etc/acpi/events/Fn-F9 stehen:

Quellcode

1
2
3
4
5
# Fn + F9
# Wechsellaufwerkschublade öffnen

event=ibm/hotkey HKEY 00000080 00001009
action=/home/skripte/acpi/Fn-F9.sh

Im Skript /home/skripte/acpi/Fn-F9.sh steht:

Quellcode

1
2
3
4
5
6
7
8
#!/bin/bash
# Fn + F9
# Wechsellaufwerkschublade öffnen

/usr/kde/3.5/bin/kdialog --passivepopup "Wechsellaufwerkschublade wird geöffnet.." 2
/usr/bin/xosd "Wechsellaufwerkschublade wird geöffnet."
/usr/bin/eject
whoami

Der Befehl xosd ruft das Skript /home/skripte/xosd.sh auf:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh
# 2006-03-09 <pille@struction.de>
#
# displays text in arguments on X screen using osd_cat (in some nicely preconfigured style)

OSD_CAT=`which osd_cat`
XOSD="${OSD_CAT} --delay=3 --age=3 --pos=middle --align=center --font="-*-helvetica-*-*-*-*-*-240-*-*-*-*-*-*" --color=green --shadow=1"

# get user running X display (needed when run by script)
XUSER=`ps -C Xsession -o user h`

if [ "${USER}" == "${XUSER}" ]; then
    echo $@ | ${XOSD}
else
    echo $@ |su ${XUSER} -c "DISPLAY=${DISPLAY:-:0.0} ${XOSD}"
fi

Beim Drücken der Sondertastenkombination Fn+F9 wird Folgendes in die Logdatei /var/log/acpid für das ACPI-Ereignis geschrieben:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
10.07.2007 19:26:09	executing action	/home/skripte/acpi/Fn-F9.sh
10.07.2007 19:26:09	none		BEGIN HANDLER MESSAGES
10.07.2007 19:26:09	none		notifying client 6422[0:0]
10.07.2007 19:26:09	none		notifying client 6694[0:0]
10.07.2007 19:26:09	received event	ibm/hotkey HKEY 00000080 00001009
10.07.2007 19:26:11	none		Error initializing osd: No display
10.07.2007 19:26:11	none		kdialog: cannot connect to X server
10.07.2007 19:26:14	completed event	ibm/hotkey HKEY 00000080 00001009
10.07.2007 19:26:14	none		action exited with status 0
10.07.2007 19:26:14	none		END HANDLER MESSAGES
10.07.2007 19:26:16	none		root
Dabei werden die Befehle '/usr/bin/eject' und 'whoami' problemlos ausgeführt. Der ausführende User ist laut Logdatei 'root'. Die Befehle '/usr/bin/xosd' und '/usr/kde/3.5/bin/kdialog' führen zu Fehlermeldungen in der Logdatei:
10.07.2007 19:26:11 none Error initializing osd: No display
10.07.2007 19:26:11 none kdialog: cannot connect to X server


Wird das Skript /home/skripte/acpi/Fn-F9.sh aber manuell als 'root' ausgeführt:

Quellcode

1
2
# /home/skripte/acpi/Fn-F9.sh
root
funktionieren alle Befehle im Skript und der ausführende User ist wieder 'root'.

Leider habe ich bis jetzt noch keine Lösung für mein Problem gefunden. Warum wird dasselbe Skript vom selben User 'root' manuell und über ACPI-Ereignis unterschiedlich ausgeführt? Und wie bekomme ich es hin, dass alle Befehle im Skript, wenn es über das ACPI-Ereignis gestartet wird, einwandfrei ausgeführt werden?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »gasto« (11.07.2007, 09:48)


2

10.07.2007, 21:03

RE: ThinkPad Sondertasten mit ACPI: Skriptprobleme

Uersache:
Dein Script leuft unter root, aber bestimmt nicht Dein X!

Lösung:
Da muß ich jetzt auch suche ....
Meine Rechtschreibfehler sind gewollt und unterliegen dem Copyright des Verfassers, es sei denn, sie sind explizit unter die GPL gestellt .....

Außerdem sind sie ein Ausdruck der Persönlichkeit des Schreibers!

3

10.07.2007, 21:33

Danke, für den ersten Hinweis, nach einer weiteren Suche bin ich auf

Alle Macht dem User - xhost vs. xauth

gestoßen. Leider konnte ich damit noch nicht all zu viel anfangen. :( Mein Umstieg zu Linux liegt noch nicht so lange zurück.

4

11.07.2007, 00:44

Zitat

... habe ich Folgendes in der Datei /etc/acpi/Fn-F9 stehen:

Meinst du /etc/acpi/events/Fn-F9? Da gehören diese Dateien eigentlich hin.
In /etc/acpi würde ich dann die ACPI-Skripte, die ausgeführt werden ablegen.

Bleiben wir dann erstmal bei der kdialog-Zeile, den Rest (xosd, eject, whoiam) kommentierst du mal aus.
Ändere die Zeile in:

Quellcode

1
DISPLAY=:0 /usr/kde/3.5/bin/kdialog --passivepopup "Wechsellaufwerkschublade wird geöffnet.." 2

Bzw. pass die DISPLAY=... an das an, was rauskommt, wenn du als User ein

Quellcode

1
echo DISPLAY=$DISPLAY

machst.

Jetzt berichte mal.

Du könntest auch mal posten, was die Ausgabe von ... ist:

Quellcode

1
echo export `ps -C X -o cmd | sed -ne '/^X/{s/X[^:]* \(:[0-9.]*\) .*/DISPLAY=\1/;p}' | uniq`
"Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun."
"It's only after we've lost everything, that we're free to do anything!"

Jabber: Die ID kann via PN erfragt werden.

5

11.07.2007, 09:46

Zitat

Original von maggu2810
Meinst du /etc/acpi/events/Fn-F9? Da gehören diese Dateien eigentlich hin.


Ups, da hast Du natürlich recht, ich meinte eigentlich /etc/acpi/events/Fn-F9. :rolleyes: Ich änder das mal in meinem ersten Beitrag.

Die Ausgabe von

Quellcode

1
echo export `ps -C X -o cmd | sed -ne '/^X/{s/X[^:]* \(:[0-9.]*\) .*/DISPLAY=\1/;p}' | uniq`
ist

Quellcode

1
export
Hmm, das ist wahrscheinlich nicht das gewünschte Ergebnis. ?(

Ein 'echo DISPLAY=$DISPLAY' hat 'DISPLAY=:0.0' als Ergebnis. Ich nutze xinerama für dualhead, d.h. ich nutze zwei Monitore zusammen als eine Arbeitsfläche.

Der Inhalt des Skripts sieht dann folgendermaßen aus:

Quellcode

1
2
3
4
5
6
7
8
#!/bin/bash
# Fn + F9
# Wechsellaufwerkschublade öffnen

DISPLAY=:0.0 /usr/kde/3.5/bin/kdialog --passivepopup "Wechsellaufwerkschublade wird geöffnet.." 2
# /usr/bin/xosd "Wechsellaufwerkschublade wird geöffnet."
# /usr/bin/eject
# whoami


Beim Drücken der Tastenkombination Fn+F9 passiert leider nichts, beim manuellen Ausführen des Skripts '/home/skripte/acpi/Fn-F9.sh' wird das "passivepopup" von kdialog jedoch angezeigt.

6

11.07.2007, 10:16

Könntest nur mal testweise als Bentuzer (bzw. die Person, mit der du den XServer startest)

Quellcode

1
xhost +local:localhost

eingeben und dann selbiges nochmal probieren.
"Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun."
"It's only after we've lost everything, that we're free to do anything!"

Jabber: Die ID kann via PN erfragt werden.

7

11.07.2007, 10:41

So ich habe den Befehl eingegeben:

Quellcode

1
2
$ xhost +local:localhost
non-network local connections being added to access control list

und anschließend Fn+F9 gedrückt. Leider hat sich nichts verändert, das "passivpopup" von kdialog wird nicht angezeigt.

8

11.07.2007, 11:14

Mach folgendes:

Quellcode

1
DISPLAY=:0.0 /usr/kde/3.5/bin/kdialog --passivepopup "Wechsellaufwerkschublade wird geöffnet.." 2 &> /tmp/output

So bekommen wir in /tmp/output die Ausgabe des Befehls und sehen, was ihm nicht passt.
Denke aber eh, dass das, was du mit deinem Skript machst, eigentlich nicht über ACPI laufen muss. Das kannst du doch viel einfacher über z.B. xbindkeys machen.

-- edit --

Wir könnten das ganze wohl schneller über einen Jabber / ICQ / IRC / ... machen.
"Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun."
"It's only after we've lost everything, that we're free to do anything!"

Jabber: Die ID kann via PN erfragt werden.

9

18.07.2007, 10:57

Mit folgender Zeile im Skript wird eine kdialog Meldung erzeugt:

Quellcode

1
su username -c "DISPLAY=:0.0 /usr/kde/3.5/bin/kdialog --passivepopup 'Wechsellaufwerkschublade wird geöffnet.' 2"

Mit xosd geht das leider so nicht. Es soll laut maggu2810 auch eine sauberere Lösung geben, welche ich mit meinem eingeschränkten Wissen noch nicht ganz nachvollziehen und an meine Bedürfnisse anpassen konnte (siehe angehängtes Skript action.sh)