How to run a script at screen lock / unlocks in ubuntu 17.10
Solution 1
Assuming you're using Gnome then Nowadays I think it's better to listen to the LockedHint
rather than screensaver messages. That way you're not tied to a screensaver implementation.
Here's a simple script to do that:
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
Gives this:
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
Solution 2
Use the existence of the process gnome-screensaver-dialog as an alternative trigger
If dbus
is not possible or not preferred for whatever reason, you can use the existence of the process gnome-screensaver-dialog
as a trigger. The process is called on lock screen.
In a python script:
#!/usr/bin/env python3
import psutil
import time
import subprocess
procname = "gnome-screensaver-dialog"
lock_command = "/path/to/lockscript"
unlock_command = "/path/to/unlockscript"
lock1 = None
while True:
time.sleep(2)
lock2 = procname in (p.name() for p in psutil.process_iter())
if lock2 != lock1:
if lock2:
subprocess.Popen(lock_command)
print("locked")
else:
subprocess.Popen(unlock_command)
print("unlocked")
lock1 = lock2
How to use
- Copy the script into an empty file, save it as
locktoggle.py
In the head section:
lock_command = "/path/to/lockscript" unlock_command = "/path/to/unlockscript"
set the commands or paths to the scripts you'd like to run (leave the double quotes!)
Test- run the script with the command:
python3 /path/to/locktoggle.py
N.B. In case you only run a command on either one of the events lock/unlock, simply comment out the corresponding line in the section:
if lock2 != lock1:
if lock2:
# subprocess.Popen(lock_command)
print("locked")
else:
# subprocess.Popen(unlock_command)
print("unlocked")
Related videos on Youtube
eddieferetro
Updated on September 18, 2022Comments
-
eddieferetro over 1 year
My problem is the same of this question but I am not able to get it working in ubuntu 17.10:
How to run a command or script at screen lock/unlock?
I want to run a script that changes my keyboard RGB configuration at screen locks. The script runs flawless. The problem is to get the event of the locking/unlocking. I have try using dbus-monitor as said in that question and as said here:
https://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html
So running this script:
#!/bin/bash dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \ ( while true do read X if echo $X | grep "boolean true" &> /dev/null; then echo "locking at $(date)" >> $HOME/time_xprofile elif echo $X | grep "boolean false" &> /dev/null; then echo "unlocking at $(date)" >> $HOME/time_xprofile fi done )
But it only works... a few times(!).... I cannot understand what happens.
I'm using ubuntu 17.10 with ubuntu's gnome over X-server (no Wayland) and have try vanilla gnome and have the same problem.
I have try too:
dbus-monitor > out.log
To see ALL the traces that occur while locking/unlocking and it doesn't appear that signal... Only.... well... very few times...
I don't know what to do know, Any advice will be helpfull.
-
Jacob Vlijm over 6 yearsIf you run in a terminal
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
, does it toggle true/false on lock/unlock? -
eddieferetro over 6 yearsI tryed it before running dbus-monitor withouth parameters and no, it doesn't toggle true/false.
-
Jacob Vlijm over 6 yearsAh, sorry, should have seen it in the question . I asked because it does work here though. (UB 17.10, mutter).
-
Jacob Vlijm over 6 yearsCan't test it on your system, but could you first run:
pgrep -f gnome-screensaver
, and subsequently:sleep 10 && pgrep -f gnome-screensaver
, immediately lock screen, wait10-15 seconds and then unlock again. On my system[1]
shows one pid,[2]
shows two pids. That would be something to work with. If dbus is no option. -
Jacob Vlijm over 6 years^ works perfectly, and should be fine on all gnome-based systems.
-
-
eddieferetro over 6 yearsIt's a great idea but didn't worked for me :(. There's no gnome-screensaver-dialog. I think that it could be -and is only a theory- that ubuntu doesn't have, by default, screen-saver and it only has a login screen? I'll try at home instaling xscreensaver and using your solution that I found very clean and reusable.
-
Jacob Vlijm over 6 years@eddieferetro huh?? That is weird, gnome screensaver dialog, although the name suggests so, has nothing to do with screensaver, I don't have screensaver either.
-
Jacob Vlijm over 6 years@eddieferetro could you run
sleep 10 && pgrep -f gnome-screensaver
, immediately lock screen, wait10-15 seconds and then unlock again? See what the output is? Your distro is Gnome? (Ubuntu Gnome) -
eddieferetro over 6 yearsi'm cannot access my computer from here (proxies). I did what you say yesterday and didn't show any process number... :( is weird, I know, I'm going crazy with this... My distro is ubuntu 17.10 and the desktop is the default ubuntu-gnome... I'll retry this nigth to avoid the posibility of a human error... but I remember myself doin what you say and thinking on taking a screenshot because I know that you would find it incredible... as I found it...
-
Jacob Vlijm over 6 years@eddieferetro I'll install 17.10/Gnome in a VM. Curious to what I will see :)
-
eddieferetro over 6 yearsWasn't human error.