Ausführen des Skripts nach dem Fortsetzen und nach dem Entsperren des Bildschirms

13

In Ubuntu 12.04 LTS möchte ich Skripte ausführen, nachdem ich aus dem Standby-Modus zurückgekehrt bin und meinen Desktop entsperrt habe. Diese müssen als mein Benutzer und mit Zugriff auf meine ausgeführt werden $DISPLAY.

Insbesondere möchte ich

  • Starten Sie neu nm-applet, um den Fehler 985028 zu umgehen
  • Zeigen Sie eine benutzerdefinierte Benachrichtigung mit notify-send
  • Möglicherweise andere Sachen, wenn ich diese zum Laufen bringe

Wenn ich fortfahre, werden die Skripte in /etc/pm/sleep.d/ausgeführt, aber sie werden als root ausgeführt, ohne dass mein Bildschirm und mein Benutzername bekannt sind. Es könnte funktionieren, wenn ich meinen Benutzernamen und exportden Standard DISPLAY :0in diesen Skripten fest codiere, aber das fühlt sich wie ein sehr hässlicher Hack an.

Skripts ~/.config/autostart/xyz.desktopwerden nach der Anmeldung ausgeführt, jedoch nicht, nachdem der Bildschirm nach dem Fortsetzen entsperrt wurde.

Gibt es eine Möglichkeit, nach dem Entsperren des Bildschirms nach einem Lebenslauf Skripts auszuführen?

mivk
quelle
Um den Benutzernamen nicht hart zu codieren, könnten Sie ihn verwenden users, vorausgesetzt, niemand anderes ist angemeldet (oder es spielt keine Rolle)
Sparhawk

Antworten:

9

Es sieht so aus, als müssten Sie den Benutzernamen in der vorherigen Antwort ohnehin hart codieren. Hier ist ein einfaches Skript für /etc/pm/sleep.d, wenn jemand nach einer schnellen Lösung sucht:

#!/bin/bash 
case "$1" in
    hibernate|suspend)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on suspend"
        ;;
    thaw|resume)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on resume"
        ;;
esac
Aaron-Bru
quelle
5

Diese Frage auf der Unix- und Linux-Site dokumentiert einen alternativen Ansatz unter Verwendung von dbus-Nachrichten:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean true" &> /dev/null; then SCREEN_LOCKED; elif echo $X | grep "boolean false" &> /dev/null; then SCREEN_UNLOCKED; fi done )

(Ersetzen Sie SCREEN_LOCKED und SCREEN_UNLOCKED durch die Aktionen, die Sie ausführen möchten.)

Mit xrandr 1>/dev/null 2>1wie die Aktion auf Entriegelung mein Problem behoben , dass Monitorauflösungen / Positionen nicht richtig wurden auf dem Bildschirm Entriegeln restauriert (xrandr scheint eine erneute Lesen von Bildschirmeinstellungen zu verursachen). Ich habe diese Zeile als Hintergrundaufgabe in mein .bash_profile eingefügt (genau genommen ist es besser als Desktop-Datei in ~ / .config / autostart, da dies nur beim Start von gnome ausgeführt wird):

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean false" &> /dev/null; then xrandr 1>/dev/null 2>1; fi done ) &

Weitere Hintergrundinformationen zur Gnome-Bildschirmschoner-API finden Sie auf dieser Site und auf dem dbus-Monitor hier .

Kim SJ
quelle
1

Eine Lösung ist ein Skript, das beim Anmelden am Desktop ausgeführt wird und das dbus-Nachrichten abfängt. Nach dem Fortsetzen nach dem Anhalten wird der Bildschirm gesperrt, und nach der Eingabe des Kennworts tritt auf dem dbus ein Unlock-Ereignis auf.

(Vielen Dank an Kim SJ, der mich auf den richtigen Weg gebracht hat. Ich habe keine ScreenSaver-Signale, aber eine andere Schnittstelle gefunden).

In habe ~/.config/autostart/ich eine .desktop-Datei, die ein Bash-Skript startet:

$ cat ~/.config/autostart/mymonitor.desktop
[Desktop Entry]
Categories=System;Monitor;
Comment=Monitor dbus for unlock signals
Exec=/usr/local/bin/unlock_monitor
Name=unlock_monitor
Type=Application

Das unlock_monitorMonitor-Skript liest dbus-Nachrichten aus com.canonical.Unity.Sessionund verarbeitet UnlockedSignale:

#!/bin/bash

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session" --profile \
| while read dbusmsg; do
    if [[ "$dbusmsg" =~ Unlocked$ || "$dbusmsg" =~ NameAcquired$ ]] ; then
        sleep 5
        notify-send "$(basename $0)" "Unlocked or freshly logged in..."
        # ...
    fi
done

Beim Einloggen gibt es kein "Unlocked" Signal, aber beim dbus-monitorStart ein "NameAcquired" Signal .

mivk
quelle
0

Sie können ein Skript mit start-stop-daemon ausführen. start-stop-daemon kann den Thread als unterschiedliche UID und GID ausgeben und so Ihr Problem lösen.

Sie müssen lediglich ein Jobskript schreiben, das wie in System PATH platziert ist /usr/bin , und ein zusätzliches Daemon-Skript in zu erstellen /etc/pm/sleep.d. Übereinstimmende pm-suspendAktion wie resumeoder thawdas Daemon-Skript schreibt das Job-Skript über fest

start-stop-daemon --start $ARGs --name nm-rtvt--exec /usr/bin/job_script

wo ARGskönnte sein --chuid 1001:1001oder nur --user your_username.

Und aus Gründen der Integrität können Sie auch das Dämonskript verwenden, um den genannten Damon zu stoppen, nm-rtvtbevor Sie ihn über aussetzen

start-stop-daemon --stop <...>

passende pm-suspendAktionen wie suspendoder hibernate.

Für Details man start-stop-daemon. Und es gibt viele andere Beispiele /etc/init.dfür Daemon-Skripte.

Funicorn
quelle