[gelöst] suspend2ram außer Programm X ist gestartet

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

[gelöst] suspend2ram außer Programm X ist gestartet

Beitrag von Patsche » 04.06.2014 16:12:19

Hi,

ich muss mich mal wieder an euch wenden. Ich nutze hier Jessie mit Xfce und ärgere mich jedesmal über mich selbst, dass ich den Laptop zuklappe, obwohl gerade ein ein großer Download läuft. Jetzt gibt es ja mehrere Möglichkeiten, wobei mir ein Script am liebsten wäre, welches überprüft, ob beispielsweise Debianunison gerade aktiv ist, wenn ja, dann kein suspend nach dem zuklappen, wenn nicht -> ab in den standby. Das Skript sollte für erfahrene Skripter wohl nicht schwer sein, da ja nur eine if-Anweisung gebraucht wird. Ob ein Programm läuft könnte man ja beispielsweise mit "ps -A" und "grep" in Erfahrung bringen. Aber ich weiß nicht, wie ich das ganze nun zusammenschustere und wie ich dem System klar mache, dass beim zuklappen dieses Skript benutzt wird. Das ganze muss natürlich ohne Eingabe des Passwortes funktionieren, sonst wäre es ja sinnlos. Ich weiß absolut nicht wie ich da ansetzten soll. Könnt ihr mir helfen? Am besten wie ne Anleitung, wenn es ginge. Ich danke euch vielmals.
Zuletzt geändert von Patsche am 19.06.2014 17:54:58, insgesamt 1-mal geändert.

Benutzeravatar
frodo
Beiträge: 342
Registriert: 08.06.2007 09:16:15
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Burnley
Kontaktdaten:

Re: suspend2ram außer Programm X ist gestartet

Beitrag von frodo » 04.06.2014 17:58:23

Moin,

bin ja auch nicht so der Bash Profil..... vielleicht hilft dir das weiter:)

Code: Alles auswählen

ps -A | grep -q -w unison && echo "running"  || echo "not running"
Statt den echo könnte eine Abfrage helfen :lol:

Ohne Passwort Eingabe..... würde ich das mit sudo machen

Code: Alles auswählen

%sudo     ALL = NOPASSWD: ALL
Frank
VDR: MSI C847MS-E33 onboard. Intel® Celeron® 847 | GT520 | VDR 2.1.6 | Stable | Kernel 3.15.7
Notebook: Lenovo G530 | Wheezy| icewm | Kernel 3.2.0-4-686

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: suspend2ram außer Programm X ist gestartet

Beitrag von Patsche » 04.06.2014 18:04:22

Das Problem ist, dass der Befehl für das Wechseln in den Standbymodus in der Konsole root Rechte braucht:

Code: Alles auswählen

pm-suspend
Oder gibt es noch was anderes? Im Menü von Xfce, also in der GUI, kann ich ja als Benutzer über "Abmelden" -> "Bereitschaft" in den Ruhezustand wechseln. Auf welchen Befehl greift denn die GUI zu? Ich muss ja am besten da irgendwie ansetzten und die if-Anweisung einbauen, aber wo und vorallem wie?

Benutzeravatar
frodo
Beiträge: 342
Registriert: 08.06.2007 09:16:15
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Burnley
Kontaktdaten:

Re: suspend2ram außer Programm X ist gestartet

Beitrag von frodo » 04.06.2014 18:39:05

Moin,
Das Problem ist, dass der Befehl für das Wechseln in den Standbymodus in der Konsole root Rechte braucht:
Das sollte ja mit sudo kein Problem sein..... wenn es mal eingerichtet ist.

Code: Alles auswählen

sudo pm-suspend

Code: Alles auswählen

#!/bin/bash


prozess=`ps -A | grep -q -w unison`

if [ $prozess -eq 0 ] ; then

kdialog --msgbox "Download ist Aktiv"

else

sudo pm-suspend
fi


exit 0
In die Abfrage könnte man sicher auch gtkdialog einbauen.... keine Ahnung wie da Syntax ist.



Frank
VDR: MSI C847MS-E33 onboard. Intel® Celeron® 847 | GT520 | VDR 2.1.6 | Stable | Kernel 3.15.7
Notebook: Lenovo G530 | Wheezy| icewm | Kernel 3.2.0-4-686

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: suspend2ram außer Programm X ist gestartet

Beitrag von Patsche » 04.06.2014 19:10:32

Und wie baue ich das Skript ein? Es soll ja beim Zuklappen abgearbeitet werden. sudo habe ich nicht eingerichtet, aber wenn ich deinen Ansatz nehme:

Code: Alles auswählen

%sudo     ALL = NOPASSWD: ALL
Werden dann alle Befehle mit vorangestelltem sudo ohne Passwortabfrage abgearbeitet. Natürlüch muss man in der sudoers sein, dass ist mir klar. Aber damit geht ja ein Sicherheitsaspekt flöten, oder?
Danke für die Hilfe!

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: suspend2ram außer Programm X ist gestartet

Beitrag von smutbert » 04.06.2014 20:17:22

Patsche hat geschrieben:[…]Auf welchen Befehl greift denn die GUI zu? Ich muss ja am besten da irgendwie ansetzten und die if-Anweisung einbauen, aber wo und vorallem wie?
Die DE macht das wohl über dbus oder ähnliche Mechanismen, die eigentliche Arbeit erledigt dann upower.

Code: Alles auswählen

dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
Je nachdem wie dieser Befehl ausgeführt wird, musst du noch etwas unternehmen, dass der Benutzer das auch darf (von vornherein darf das dank consolekit nur ein lokal angemeldeter Benutzer, wenn ein Skript gestartet wird, zählt das uU nicht als solcher). Dafür kann man zB /usr/share/polkit-1/actions/org.freedesktop.upower.policy ändern oder vielleicht unter /etc eine eigene policy erstellen: http://askubuntu.com/a/79927. Auch damit sich ein Skript überhaupt per dbus verbinden kann, musst du vielleicht noch etwas machen (Google ist da schlauer als ich).



Wäre nicht vielleicht auch ein Ansatz denkbar, der die Stromsparmodi unterbindet solange ein Download läuft. Für Videoplayer (und Bildschirmschoner?) gibt es solche Programme ja schon. Konkrete Idee habe ich in dieser Richtung zwar keine, aber es würde mir besser gefallen, als ein Skript, das jedes Mal beim Zuklappen ausgeführt wird.

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: suspend2ram außer Programm X ist gestartet

Beitrag von Patsche » 04.06.2014 20:34:56

Also würde das komplizierter werden, was? :D
smutbert hat geschrieben:Wäre nicht vielleicht auch ein Ansatz denkbar, der die Stromsparmodi unterbindet solange ein Download läuft. Für Videoplayer (und Bildschirmschoner?) gibt es solche Programme ja schon. Konkrete Idee habe ich in dieser Richtung zwar keine, aber es würde mir besser gefallen, als ein Skript, das jedes Mal beim Zuklappen ausgeführt wird.
Hört sich auch gut an. Mal sehen, ob ich was finde. Vielleicht hat ja noch jemand eine Idee.

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: suspend2ram außer Programm X ist gestartet

Beitrag von smutbert » 05.06.2014 10:40:10

Patsche hat geschrieben:Also würde das komplizierter werden, was? :D[…]
nicht notwendigerweise. Hast du eine Idee wie bzw. wovon das Skript gestartet werden könnte?



Ich habe gerade etwas entdeckt
/proc/acpi/wakeup enthält eine Liste von Geräten, die den Computer aufwecken können (bzw. das Einschlafen verhindern), wobei man dieses Verhalten für jedes einzelne Gerät ein- und ausschalten kann. Bei mir hält die Ethernetschnittstelle (GLAN) das Gerät standardmäßig wach, während das WLAN (die PXSX-Zeile darüber) das nicht tut:

Code: Alles auswählen

Device	S-state	  Status   Sysfs node
PS2K	  S3	*disabled
PS2M	  S3	*disabled
RP01	  S4	*disabled  pci:0000:00:1c.0
PXSX	  S4	*disabled
RP02	  S4	*disabled
PXSX	  S4	*disabled
RP03	  S4	*disabled
PXSX	  S4	*disabled
RP04	  S4	*disabled
PXSX	  S4	*disabled
RP05	  S4	*disabled
PXSX	  S4	*disabled
RP06	  S4	*disabled
PXSX	  S4	*disabled
RP07	  S4	*disabled
PXSX	  S4	*disabled
RP08	  S4	*disabled  pci:0000:00:1c.7
PXSX	  S4	*disabled  pci:0000:02:00.0
GLAN	  S4	*enabled   pci:0000:00:19.0
EHC1	  S4	*enabled   pci:0000:00:1d.0
EHC2	  S4	*enabled   pci:0000:00:1a.0
XHC	  S4	*enabled   pci:0000:00:14.0
HDEF	  S4	*disabled  pci:0000:00:1b.0
PEG0	  S4	*disabled
PEGP	  S4	*disabled
PWRB	  S3	*enabled 
weiß nicht ob sich das für das Verhalten beim Zuklappen verwenden läßt.


und noch etwas: systemd-inhibit
Damit sollte sich der Standby/Suspend, wenn du systemd verwendest vorübergehend deaktivieren oder das Zuklappen ignorieren lassen (siehe manpage :wink:). So könnte zB ein cron Skript so eine Sperre einrichten, wenn unison läuft/etwas tut — etwas beunruhigend finde ich dabei nur, dass ich in der Manpage auf Anhieb keine Möglichkeit gefunden habe diese Sperre wieder aufzuheben.


und gerade ist mir noch etwas einfacheres gekommen!
Ein Skript, das checkt, ob der Standby erlaubt ist (also unison nicht läuft oder idle ist) und sich andernfalls mit einem exit-Status ungleich 0 beendet. Dieses Skript plazierst du in /etc/pm/sleep.d/ und sorgst durch eine Abfrage dafür, dass es nur beim Versuch einen Suspend auszulösen ausgeführt wird.
Ich denke das sollte den Suspend ebenfalls verhindern. Grundgerüste für die Abfragen solche Skripte findet man relativ leicht:

Code: Alles auswählen

#!/bin/sh
case "$1" in
        hibernate|suspend) 
        #hier kommt die Abfrage nach unison und gegebenenfalls das exit 1 oä hin.
        ;;
esac
(ich finde diese letzte Idee, ist die mit dem größten Potential :mrgreen: ­— wenn es mir als erstes eingefallen wäre, hätte ich es mir erspart die Absätze davor zu schreiben, aber deswegen lösche ich sie jetzt auch nicht mehr…)

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: suspend2ram außer Programm X ist gestartet

Beitrag von Patsche » 05.06.2014 12:09:02

Vielen Dank für deine Hilfe, aber ich bekomme das alleine nicht hin :(
Ich habe jetzt eine Datei namens suspend_unison.sh in /etc/pm/sleep.d erstellt und abgespeichet. Das Skript sieht wie folgt aus:

Code: Alles auswählen

#!/bin/sh
case "$1" in
        hibernate|suspend) 
                prozess=`ps -A | grep -q unison`
                if [ $prozess -eq 0 ] ; then
                        exit 1
                        ;;
                esac

Die Option -w von grep habe ich in keiner man von grep gesehen, deswegen habe ich das mal lit der Option und ohne probiert, aber keine Änderung.

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: suspend2ram außer Programm X ist gestartet

Beitrag von smutbert » 05.06.2014 14:13:28

Ja, dein Skript ist etwas „verunglückt“ 8) Erstens fehlt das fi und zweitens kann imho die Abfrage nach dem Prozess so nicht funktionieren. Eigentlich scheue ich davor zurück anderen shellskript-Bruchstücke vorzuschlagen, weil es da wesentlich geübtere Leute gibt als mich, aber ich würde es eher so versuchen:

Code: Alles auswählen

#!/bin/sh
case "$1" in
        hibernate|suspend) 
                ps -A | grep -q unison && exit 1
                exit 0
        ;;
esac
(das ist zweifelsohne häßlich, aber es könnte funktionieren)

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: suspend2ram außer Programm X ist gestartet

Beitrag von Patsche » 05.06.2014 15:02:49

Leider nicht, ich weiß da auch nicht weiter. Habe auch mal den Tip mit dem WLAN in der /proc/acpi/wakeup ausprobiert, also die WLAN Karte ermittelt und von disabled* auf enabled* geändert. Hat aber auch keine Änderung gebracht...Dabei scheint meine Problematik doch garnicht so exotisch, oder? Ich bin weiterhin für jede Hilfe dankbar.

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: suspend2ram außer Programm X ist gestartet

Beitrag von smutbert » 05.06.2014 15:10:58

Hast du auch daran gedacht, das Skript ausführbar zu machen?
(das Skript selbst hat bei mir funktioniert, ich konnte nur noch nicht testen, ob es auch wie gedacht den Suspend zuverlässig verhindert)

EDIT:
Bei der Benennung wäre es vielleicht dieses Schema besser: https://wiki.archlinux.org/index.php/pm ... _own_hooks
also etwa /etc/pm/sleep.d/00unison

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: suspend2ram außer Programm X ist gestartet

Beitrag von Patsche » 05.06.2014 15:23:16

smutbert hat geschrieben:Hast du auch daran gedacht, das Skript ausführbar zu machen?
:facepalm: Das hab ich vergessen. Super, jetzt klappt es :THX: Das ist ja gut. Was passiert denn jetzt, wenn ich den zuklappe und dann unison beendet wird? Geht er dann in den Standby? Werde das mal ausprobieren. Das Thema ist somit gelöst, wenn ich jetzt noch ein weiteres Programm nehme, sollte ich lieber ein 2. Skript nehmen, oder dem Vorhandenem ein case2 spendieren?
Danke

Code: Alles auswählen

smutbert
für deine Hilfe!

OT:
Nehmen wir mal an, dass ich unsion ausführe und nach der Synchronisation soll er herunterfahren oder in den Standby gehen. Wie stell ich das ohne root-Rechte an?

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: suspend2ram außer Programm X ist gestartet

Beitrag von smutbert » 05.06.2014 15:47:05

mit mehreren Programmen sollte es eigentlich so funktionieren:

Code: Alles auswählen

#!/bin/sh
case "$1" in
        hibernate|suspend) 
                ps -A | grep -q unison && exit 1
                ps -A | grep -q anderesProgramm && exit 1
                exit 0
        ;;
esac

Nach dem Beenden von unison wird der PC nicht mehr automatisch in den Suspend gehen, zumindest nicht deswegen weil der PC zugekplappt ist. Nach einem Timeout (wenn der xfce-power-manager so konfiguriert ist) sollte es schon passieren.


Wenn du unison als normaler Benutzer ausführst und es sich hinterher beendet könntest du so einen dbus-Befehl verwenden, wie ich ihn vorher gepostet habe, um den Computer hinterher schlafenzulegen

Code: Alles auswählen

unison ; dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
(weiß aber nicht ob das jetzt suspend to ram oder disk ist)

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: suspend2ram außer Programm X ist gestartet

Beitrag von smutbert » 05.06.2014 17:34:47

Ah, was den dbus Befehl angeht (http://upower.freedesktop.org/docs/UPower.html):
- org.freedesktop.UPower.Suspend ist suspend2ram
- org.freedesktop.UPower.Hibernate ist suspend2disk

Antworten