
Ich habe eine Tkinter-App erstellt, die das Drücken des Power-Buttons verarbeitet, aber sie startet nicht, wenn sie sollte. Wenn ich sie jedoch echo hello>>~/junk
als ACPI-Aktion verwende, fügt sie bei jedem Drücken des Power-Buttons ein „Hello“ zu Junk hinzu. Das Hinzufügen eines Execs oder eines Punkts vor dem Aktionsbefehl (um ihn in der aktuellen Shell auszuführen) hat nicht geholfen. Wie kann ich es zum Laufen bringen?
Bearbeiten:
Ok, ich habe es mit Hilfe von mikejonesey zum Laufen gebracht, aber danach ist noch ein weiteres Problem aufgetreten. Das Skript wird mit Root-Rechten aufgerufen, selbst wenn das Suid-Bit im Skript gesetzt ist, also muss ich das Root-Passwort auf dem Xlock-Bildschirm eingeben, um fortzufahren.
Bearbeitung 2:
Es sieht so aus, als könnte ich die App aus einer ACPI-Ereignisdatei wie dieser starten:
event=button/power PBTN action=export DISPLAY=:0 && export XAUTHORITY=/home/saga/.Xauthority &&/home/saga/bin/shutdownprompt
aber nicht von einem Handler-Skript, das von einer Ereignisdatei aufgerufen wird:
button/power ) if [ "$2" = "PBTN" ];then export DISPLAY=:0 && export XAUTHORITY=/home/saga/.Xauthority && /home/saga/shutdownprompt; fi ;;
Dies ist ein Ausschnitt aus dem Haupthandlerskript, das bei jedem Tastendruck aufgerufen wird. Was ist hier das Problem?
Antwort1
Sie müssen einige Dinge hinzufügen, um X zu verwenden;
Ich verwende diese in einem Cronjob (es ist dasselbe ...)
#*/15 * * * * export DISPLAY=:0.0 && export XAUTHORITY=/home/mike/.Xauthority && /home/mike/bin/defunct-check.sh
Dies sollte mit jedem Skript funktionieren.
Antwort2
Es scheint, als gäbe es für dieses Problem eine einfache Lösung. Ich selbst habe versucht, etwas Ähnliches zu tun: ein Bildschirmaufnahmeprogramm (Flameshot) auszuführen, wenn eine Taste auf der Tastatur gedrückt wird.
Die Lösung, die für mich letztendlich funktioniert hat, war die Erstellung einer FIFO (Named Pipe) in meinem Home-Verzeichnis mit dem Namen .acpi_execute.pipe
. Anschließend verwende ich das folgende Skript mit dem Namen .acpi_execute
.
#!/usr/bin/bash
while true ; do
while IFS='' read command ; do
$command
done < ~/.acpi_execute.pipe
done
Ich bevorzuge i3 gegenüber GNOME, KDE usw. aufgrund seiner Leistung (sehr leicht) und Kachelfunktion. Am Ende meiner i3-Konfigurationsdatei ~/.config/i3/config
habe ich:
exec ~/.acpi_execute
Dadurch kann das Skript bei jedem Start meiner Desktop-Umgebung ausgeführt werden (entweder direkt auf dem Computer oder über eine Remote-VNC-Verbindung).
Beachten Sie, dass das oben genannte Sicherheitsrisiko mit sich bringt. Wenn beispielsweise jemand in die obige Pipe schreiben kann, kann er beliebige Befehle ausführen.wie du. Das wäre natürlich schlecht. Indem Sie dem FIFO 600 Berechtigungen erteilen, die Ihnen gehören, verringern Sie dieses Risiko. Sie können auch die möglichen Befehle einschränken. Führen Sie also nicht aus $command
, sondern den gewünschten Befehl (z. B. flameshot gui
).