Üdv!
A hal daemon D-Buson keresztül üzenget a nagyvilágnak, én meg szeretnem, ha egy bizonyos event eseten lefutna egy program. Erre nem szeretnék komolyabb programot írni, pythonhoz meg egyáltalán nem értek.
Ezért a kérdés az, hogy milyen módon lehet figyelni a D-Bus-t bash scriptből? Lehetséges egyáltalán?
A dbus-monitor elvileg alkalmas ilyesmire, azonban a probléma az, hogy nem lép ki, és addig nem tudom elindítani a kívánt programot, amíg kézzel le nem állítom.
- 1221 megtekintés
Hozzászólások
Végül a problémám megoldom máshogy, de közben elkezdtem írni egy scriptet, ez lett belőle:
#!/bin/bash
dbus-monitor --system "interface=org.freedesktop.Hal.Device" > /tmp/dbus-monitor-output &
while true; do
if [ "$(tail -n 1 /tmp/dbus-monitor-output|grep sleep|wc -l)" = "1" ]; then
echo sleep
killall dbus-monitor
rm /tmp/dbus-monitor-output
exit
elif [ "$(tail -n 1 /tmp/dbus-monitor-output|grep power|wc -l)" = "1" ]; then
echo power
killall dbus-monitor
rm /tmp/dbus-monitor-output
exit
fi
done
A lényeg: dbus-monitor kimenetét fileba irányítom, majd azt egy while true keretében olvasom vissza, és dolgozom fel.
A problémát egyébként az acpid helyrehozatala oldotta meg. :)
- A hozzászóláshoz be kell jelentkezni
es igy nem mukodik?
dbus-monitor --system "interface=org.freedesktop.Hal.Device"|while read i
do
if [ "echo $i|grep sleep|wc ....
fi
done
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
Elvileg működik, bár még nem sikerült összehoznom. Viszont ha kiszedem az ifet, és a benne levő kifejezést vizsgálom, akkor a megfelelő outputot kapom. Szóval biztos én szúrom el valahol.
- A hozzászóláshoz be kell jelentkezni
A fenti while true; do
megoldás helyett szerencsésebb lenne, ha mkfifo
paranccsal létrehozol egy pipe fájlt, és a kimenetet ebbe a "fájlba" irányítod. Ezután
while true; do
log="`head valami.pipe -n 1`";
....
paranccsal kiolvashatsz belőle egy sort. Előnye: nem fut végtelen sokszor, nem terheli a procit. Ha a dbus-monitor
ír a fájlba, csak akkor fut tovább a kód.
- A hozzászóláshoz be kell jelentkezni
valószínűleg az ivman azt teszi, amit szeretnél:)
—-—-—
int getRandomNumber() {
return 4;//szabályos kockadobással választva.
} //garantáltan véletlenszerű. xkcd
- A hozzászóláshoz be kell jelentkezni