How to run a script at screen lock / unlocks in ubuntu 17.10

5,289

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

  1. Copy the script into an empty file, save it as locktoggle.py
  2. 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!)

  3. 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")
Share:
5,289

Related videos on Youtube

eddieferetro
Author by

eddieferetro

Updated on September 18, 2022

Comments

  • eddieferetro
    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
      Jacob Vlijm over 6 years
      If you run in a terminal dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'", does it toggle true/false on lock/unlock?
    • eddieferetro
      eddieferetro over 6 years
      I tryed it before running dbus-monitor withouth parameters and no, it doesn't toggle true/false.
    • Jacob Vlijm
      Jacob Vlijm over 6 years
      Ah, sorry, should have seen it in the question . I asked because it does work here though. (UB 17.10, mutter).
    • Jacob Vlijm
      Jacob Vlijm over 6 years
      Can'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
      Jacob Vlijm over 6 years
      ^ works perfectly, and should be fine on all gnome-based systems.
  • eddieferetro
    eddieferetro over 6 years
    It'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
    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
    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
    eddieferetro over 6 years
    i'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
    Jacob Vlijm over 6 years
    @eddieferetro I'll install 17.10/Gnome in a VM. Curious to what I will see :)
  • eddieferetro
    eddieferetro over 6 years
    Wasn't human error.