Script fuer einen Benutzer nach resume starten
Hallo *, nachdem ich mittlerweile gefuehlte 100 Webseiten durchgeschaut und noch auf keine fuer mich befriedigende Loesung gekommen bin, versuche ich mal hier eine entsprechende Frage abzusetzen. Ich moechte, dass ein Script fuer einen bestimmten Benutzer gestartet wird, sobald das System aus einem sleep zurueck kommt. Erschwerende Bedingung: Es ist ein Script, das die grafische Benutzeroberflaeche benoetigt, weil es Grafikprogramme, bzw. Plasma-Applets starten soll. Damit fallen leider sowohl Scripten aus /usr/lib/systemd/system-sleep als auch solche aus /etc/systemd/system weg, die @<user> fuer das Target sleep definiert wurden. Und da fuer .config/systemd/user das Target sleep nicht einmal definiert ist, kommt auch das nicht in Frage. Auch passende Notifications in der Systemkonfiguration scheint es nicht zu geben. Ich koennte nun evtl. auf dbus-Messages lauschen, aber das habe ich irgendwie nicht hinbekommen. Hat wer einen hilfreichen Tip fuer mich? Danke und ciao. Michael. -- Michael Hirmke -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hi again,
Hallo *,
nachdem ich mittlerweile gefuehlte 100 Webseiten durchgeschaut und noch auf keine fuer mich befriedigende Loesung gekommen bin, versuche ich mal hier eine entsprechende Frage abzusetzen.
Ich moechte, dass ein Script fuer einen bestimmten Benutzer gestartet wird, sobald das System aus einem sleep zurueck kommt. Erschwerende Bedingung: Es ist ein Script, das die grafische Benutzeroberflaeche benoetigt, weil es Grafikprogramme, bzw. Plasma-Applets starten soll.
Damit fallen leider sowohl Scripten aus /usr/lib/systemd/system-sleep als auch solche aus /etc/systemd/system weg, die @<user> fuer das Target sleep definiert wurden.
Und da fuer .config/systemd/user das Target sleep nicht einmal definiert ist, kommt auch das nicht in Frage.
Auch passende Notifications in der Systemkonfiguration scheint es nicht zu geben.
Ich koennte nun evtl. auf dbus-Messages lauschen, aber das habe ich irgendwie nicht hinbekommen.
Hat wer einen hilfreichen Tip fuer mich?
nehme ich immer noch gerne (vor allem wenn es einfacher wird), aber mittlerweile habe ich es von hinten durch die Brust ins Auge hinbekommen (getestet nur unter Leap 42.1): 1. Erstellen /etc/systemd/system/sleep_user@.service ------------------------< snip snip snip >----------------------------- [Unit] Description=user sleep hook Before=sleep.target StopWhenUnneeded=yes [Service] User=%I Type=oneshot RemainAfterExit=yes TimeoutSec=300 ExecStartPre=/usr/bin/logger -p info -t "user %u: suspend" ExecStart=/usr/bin/touch /home/%u/tmp/suspend.hint [Install] WantedBy=sleep.target ------------------------< snip snip snip >----------------------------- 2. systemd das Ganze neu einlesen lassen systemctl daemon-reload 3. das neue Servicefile fuer meinen Benutzer aktivieren systemctl enable sleep_user@<myuser>.service 4. Script lock_dispatch_kde erstellen ------------------------< snip snip snip >----------------------------- #!/bin/bash # ... HINTFILE=~/tmp/resume.hint if [ -n "$HINTFILE" -a -e "$HINTFILE" ] then rm -f "$HINTFILE" # Aufruf von grafischen Programmen oder von Plasma Widgets # prg1 & # prg2 & # ... fi # ... ------------------------< snip snip snip >----------------------------- Wichtig ist, dass das HINTFILE geloescht wird. 5. Script an Unlockscreen-Event haengen Configure Desktop -> Personalization -> Notifcations -> Screen Saver -> "The screen has been unlocked" -> "Run command" -> "lock_dispatch_kde" Wenn jetzt also das System in den Sleep-Modus geht, wird durch den Service sleep_user das HINTFILE erteugt. Beim ersten Entsperren des Bildschirms nach dem Resume findet das Dispatcher-Script das HINTFILE und fuehrt die angegebenen Kommandos aus. Ausserdem loescht es das HINTFILE wieder, damit nicht bei jedem Entsperren des Bildschirms versucht wird, die Programme zu starten. Das klappt natuerlich nur, wenn man angegeben hat, dass der Bildschirm ueberhaupt vor dem Sleep gesperrt werden soll. Have fun! Ciao. Michael. -- Michael Hirmke -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hi, [...]
nehme ich immer noch gerne (vor allem wenn es einfacher wird), aber mittlerweile habe ich es von hinten durch die Brust ins Auge hinbekommen (getestet nur unter Leap 42.1):
mittlerweile habe ich das Ganze mit Perls Net::DBus Modul soweit hin bekommen. Falls es jemand mal brauchen sollte: ------------------------< snip snip snip >----------------------------- #!/usr/bin/perl -w use 5.005; use strict; use IO::Handle; use Net::DBus; use Net::DBus::Dumper; use Net::DBus::Reactor; use POSIX qw( _exit ); use constant TRUE => 1; use constant FALSE => 0; $SIG{INT} = \&dbl_SignalHandler; my( %HLOCKS ); my( %SIGNALS ) = ( "PrepareForSleep" => "sleep", "PrepareForShutdown" => "shutdown", ); my( $OIF ) = dbl_getInterface() || die $!; for my $_signal ( keys %SIGNALS ) { $OIF->connect_to_signal( "$_signal", \&{ "dbl_on" . $_signal } ) || die $!; $HLOCKS{ $SIGNALS{ $_signal } } = undef; dbl_takeLocks( $_signal ) || die $!; } my( $reactor ) = Net::DBus::Reactor->main() || die $!; $reactor->run(); exit( 0 ); sub dbl_getInterface { my( $bus ) = Net::DBus->system || die $!; my( $osvc ) = $bus->get_service( "org.freedesktop.login1" ) || die $!; my( $oif ) = $osvc->get_object( "/org/freedesktop/login1", "org.freedesktop.login1.Manager", ) || die $!; return( $oif ); } sub dbl_takeLocks { my( $signal, $type ) = @_; my( $ret_val ) = FALSE; return( $ret_val ) unless( defined( $signal ) ); my( $_lock ) = $SIGNALS{ $signal }; return( $ret_val ) unless( defined( $_lock ) ); unless( exists( $HLOCKS{ $_lock } ) && ref( $HLOCKS{ $_lock } ) =~ /IO::Handle/i && $HLOCKS{ $_lock }->stat() ) { my( $fd ) = $OIF->Inhibit( $_lock, 'my signal watcher', 'preparing', 'delay' ); my( $fh ) = IO::Handle->new_from_fd( $fd, 'r' ); if( $fh->stat() ) { $HLOCKS{ $_lock } = $fh; $ret_val = TRUE; } } return( $ret_val ); } sub dbl_dropLocks { my( $signal ) = @_; my( $ret_val ) = FALSE; return( $ret_val ) unless( defined( $signal ) ); my( $_lock ) = $SIGNALS{ $signal }; return( $ret_val ) unless( defined( $_lock ) ); if( exists( $HLOCKS{ $_lock } ) && ref( $HLOCKS{ $_lock } ) =~ /IO::Handle/i && $HLOCKS{ $_lock }->stat() && $HLOCKS{ $_lock }->close() ) { $HLOCKS{ $_lock } = undef; $ret_val = TRUE; } return( $ret_val ); } sub dbl_onPrepareForAll { my( $signal, $prepost ) = @_; my( $ret_val ) = 0; my( $_lock ) = $SIGNALS{ $signal }; if( $prepost ) { if( $signal eq "PrepareForSleep" ) { # do whatever before going to sleep } else { # do whatever before shutting down # !! seems not to work !! } dbl_dropLocks( $signal ); } else { dbl_takeLocks( $signal ); if( $signal eq "PrepareForSleep" ) { # do whatever after resuming from sleep } } return( $ret_val ); } sub dbl_onPrepareForSleep { my( $prepost ) = @_; my( $ret_val ) = 0; my( $_me ) = ( caller( 0 ) )[ 3 ]; $_me =~ s/^.*:://; my( $_signal ) = $_me; $_signal =~ s/^on//; $ret_val = &dbl_onPrepareForAll( $_signal, $prepost ); return( $ret_val ); } sub dbl_onPrepareForShutdown { my( $prepost ) = @_; my( $ret_val ) = 0; my( $_me ) = ( caller( 0 ) )[ 3 ]; $_me =~ s/^.*:://; my( $_signal ) = $_me; $_signal =~ s/^on//; $ret_val = &dbl_onPrepareForAll( $_signal, $prepost ); return( $ret_val ); } sub dbl_SignalHandler { my( $sSignal ) = shift; POSIX::_exit( 0 ) if( $sSignal eq "INT" ); } ------------------------< snip snip snip >----------------------------- Ciao. Michael. -- Michael Hirmke -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (1)
-
mh@mike.franken.de