#!/usr/bin/env perl use strict; use warnings; use 5.020; use POSIX ":sys_wait_h"; $|++; my $pid = open my $fh, '-|', ( 'dbus-monitor', '--system', 'type=signal,interface=org.freedesktop.login1.Session' ) or die "couldn't spawn dbus-monitor: $!"; $SIG{CHLD} = sub { while ((my $child = waitpid -1, WNOHANG) > 0) { if ($child == $pid) { undef $pid; } } exit unless $pid; }; sub cleanup { kill KILL => $pid if $pid; undef $pid; } $SIG{TERM} = $SIG{INT} = sub { cleanup; exit; }; END { cleanup } while (<$fh>) { if (/\bmember=Lock\b/) { system("on-lock") && say "on-lock failed"; say "LOCK"; } }