3 Stimmen

Wie kann eine Java-Anwendung erkennen, dass der Linux-PC aus dem Ruhezustand (Schlafmodus) wiederhergestellt wurde?

Wie kann in einer Java Swing-Desktop-Anwendung, die unter Linux (z. B. Ubuntu) ausgeführt wird, die Anwendung darüber informiert werden, dass der PC gerade aus dem Ruhezustand/aus dem Standby-Zustand wiederhergestellt wurde?

Die Ausblendung des Bildschirms ist kein Problem. Alle anderen Suspendierungs- oder Ruhezustände (Suspendierung im RAM oder Suspendierung auf der Festplatte) sind von Interesse (und für meine Zwecke werden sie alle gleich behandelt).

Mein Ziel ist es, eine Klassenmethode automatisch aufzurufen, wenn der PC oder das Gerät wieder in Betrieb genommen wird. (Diese Methode muss übrigens rxtxSerial neu starten.)

EDIT: Ein Kommentar von Thorbjørn Ravn Andersen hat mich darauf aufmerksam gemacht, dass meine Frage nicht klar ist. Mein Ziel ist es, auf ein Betriebssystemereignis zu hören (oder eine Systemprotokolldatei zu verwenden), das anzeigt, dass das System gerade aus einem angehaltenen Zustand wiederaufgenommen wurde.

4voto

Mike Adler Punkte 1189

Lassen Sie einen Daemon-Thread die Systemzeit lesen, sagen wir einmal pro Sekunde. Wenn es eine (merkliche) Lücke zwischen zwei Messwerten gibt, ist Ihr System gerade aufgewacht. Ich bin mir allerdings nicht ganz sicher, ob dies verhindern würde, dass das System überhaupt in den Ruhezustand geht.

0voto

Meines Wissens gibt es in der Standard-Java-Laufzeitumgebung keine Klasse, die diese Informationen bereitstellt, und es gibt - ebenfalls meines Wissens - keine Standardmethode, um diese Dinge zu erfahren.

Ich würde vorschlagen, dass Sie herausfinden, wie Sie die benötigten Informationen vom Betriebssystem erhalten können - z. B. ein Skript, das installiert werden kann und dann jedes Mal ausgeführt wird, wenn das System den Aufhängungszustand ändert - und lassen Sie dieses Skript/diese native Binärdatei Ihrem Java-Programm eine Nachricht senden (oder eine Datei an einem vereinbarten Ort ablegen).

Bedenken Sie, dass es sich bei Linux-Systemen um Mehrbenutzersysteme handelt und dass Ihr Programm möglicherweise mehr als einmal aufgerufen wird, so dass Sie beim Entwurf des Mechanismus vorsichtig sein sollten.

Nur so aus Neugier: Warum muss Ihr Programm das wissen?

0voto

MountainX Punkte 6004

Der Canonical-Supporttechniker hat Folgendes vorgeschlagen.


20/11/2011 22:53 | Jason Mein Vorschlag ist, ein Skript unter /etc/pm/sleep.d/ zu erstellen. Das Skript wird beim Wiederaufnehmen aus dem Ruhezustand ausgeführt. Bitte beziehen Sie sich auf die /usr/share/doc/pm-utils/HOWTO.hooks.gz für die Details.


Hier ist das Intro aus dieser Datei:

Wie man einen pm-utils-Hook schreibt:

PARAMETER

Ein pm-utils-Hook ist einfach eine ausführbare Datei, die mindestens eine Parameter akzeptiert.

Für Hooks in sleep.d sind die möglichen Werte des ersten Parameters:

suspend -- Der Hook MUSS die entsprechende Aktion durchführen, wenn die System sich auf den Speicherschlaf (oder ein Äquivalent dazu) vorbereitet.

fortsetzen -- Der Hook MUSS die entsprechende Aktion durchführen, wenn die System aus dem Suspend-Modus kommt.

hibernate -- Der Hook MUSS jede Aktion ausführen, die angemessen ist, wenn das System sich auf das Suspend-to-Disk vorbereitet.

auftauen -- Der Hook MUSS die entsprechende Aktion durchführen, wenn das System aus dem Suspend-to-Disk-Zustand kommt.

help -- Wenn Ihr Hook die Umgebungsvariable PM_CMDLINE nach Schaltern durchsucht, SOLLTE diese Funktion einen Text ausgeben, der die geparsten Parameter in einem für einen Endbenutzer leicht verständlichen Format ausgeben.

Die tatsächlich verwendete Schlafmethode wird als zweiter Parameter übergeben -- wenn Ihr Hook suspend-hybrid (oder eine andere plattformspezifische Schlafmethode), sollte er den zweiten Parameter untersuchen.

Für Hooks in power.d sind die möglichen Werte dieses Parameters true -- der Hook MUSS die entsprechende Aktion ausführen, wenn das System auf Batteriebetrieb umschaltet. false -- Der Hook MUSS die entsprechende Aktion ausführen, wenn das System von der Batteriespannung übergeht.

Und hier ist ein Beispiel:

#!/bin/bash
case "$1" in
hibernate|suspend)
    ACTION BEFORE SUSPEND/HIBERNATE
    ;;
thaw|resume)
    ACTION AFTER RESUME
    ;;
*)
    ;;
esac
exit $?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X