Ich habe ein bisschen danach gesucht und kann anscheinend nichts hilfreiches finden.
Ich habe meinen PC mit Ubuntu 12.10 so eingerichtet, dass er nach 30 Minuten Inaktivität angehalten wird. Ich möchte das nicht ändern, es funktioniert die meiste Zeit großartig.
Ich möchte das automatische Anhalten deaktivieren, wenn eine bestimmte Anwendung ausgeführt wird. Wie kann ich das machen?
Das Nächste, was ich bisher gefunden habe, ist das Hinzufügen eines Shell-Skripts, in /usr/lib/pm-utils/sleep.d
dem überprüft wird, ob die Anwendung ausgeführt wird, und 1 zurückgegeben wird, um anzugeben, dass das Anhalten verhindert werden soll. Es sieht jedoch so aus, als würde das System das automatische Anhalten aufgeben, anstatt es nach weiteren 30 Minuten erneut zu versuchen. (Soweit ich das beurteilen kann, startet der Timer beim Bewegen der Maus erneut.) Es ist sehr wahrscheinlich, dass die Anwendung nach ein paar Stunden beendet wird. Ich möchte lieber, dass mein PC automatisch angehalten wird, wenn ich ihn nicht verwende es an diesem Punkt . (Daher möchte ich pm-suspend nach Abschluss der Anwendung nicht mehr aufrufen.)
Ist das möglich?
BEARBEITEN: Wie ich in einem der folgenden Kommentare festgestellt habe, wollte ich eigentlich das Suspendieren verhindern, wenn mein PC Dateien über NFS bereitstellt. Ich wollte mich nur auf den "Suspend" -Teil der Frage konzentrieren, da ich bereits eine Idee hatte, wie der NFS-Teil gelöst werden kann. Unter Verwendung der in einer der Antworten angegebenen 'xdotool'-Idee habe ich das folgende Skript erstellt, das ich alle paar Minuten von cron aus starte. Es ist nicht ideal, weil es den Bildschirmschoner ebenfalls davon abhält, einzuschalten, aber es funktioniert. Ich muss einen Blick darauf werfen, warum 'Koffein' das Suspendieren später nicht richtig wieder aktiviert, dann könnte ich es wahrscheinlich besser machen. Wie auch immer, das scheint zu funktionieren, also füge ich es hier ein, falls jemand anderes interessiert ist.
#!/bin/bash
# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity()
{
/usr/sbin/nfsstat --server --list
}
# Prevent the automatic suspend from kicking in.
function inhibit_suspend()
{
# Slightly jiggle the mouse pointer about; we do a small step and
# reverse step to try to stop this being annoying to anyone using the
# PC. TODO: This isn't ideal, apart from being a bit hacky it stops
# the screensaver kicking in as well, when all we want is to stop
# the PC suspending. Can 'caffeine' help?
export DISPLAY=:0.0
xdotool mousemove_relative --sync -- 1 1
xdotool mousemove_relative --sync -- -1 -1
}
LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"
echo "Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
check_activity > "$ACTIVITYFILE1"
exit 0;
fi
/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"
if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
echo "No activity detected since last run" >> "$LOG"
else
echo "Activity detected since last run; inhibiting suspend" >> "$LOG"
inhibit_suspend
fi
BEARBEITEN 2: Das obige Skript funktioniert, aber dank eines weiteren Kommentars unten verwende ich jetzt dieses Skriptpaar, das den Vorteil hat, dass der Bildschirmschoner aktiviert werden kann, während ich das Suspendieren hemme. Das erste ist /usr/lib/pm-utils/sleep.d/000nfs-inhibit, wodurch ein Suspendierungsversuch verhindert wird, wenn eine Sperrdatei vorhanden ist:
#!/bin/sh
LOG="/home/zorn/log/nfs-suspend-blocker.log"
INHIBITFILE="/home/zorn/tmp/nfs-suspend-blocker.inhibit"
echo "$0: Started run at $(date), arguments: $*" >> "$LOG"
if [ "$1" = "suspend" ] && [ -f "$INHIBITFILE" ]; then
echo "$0: Inhibiting suspend" >> "$LOG"
exit 1
fi
exit 0
Die zweite ist eine modifizierte Version des vorherigen nfs-suspend-blocker-Skripts und sollte weiterhin von cron ausgeführt werden. Es folgt nun der im Kommentar unten beschriebenen Strategie:
#!/bin/bash
# This works in tandem with /usr/lib/pm-utils/sleep.d/000nfs-inhibit, which
# will prevent a suspend occurring if $INHIBITFILE is present. Once it prevents
# a suspend, it appears that it requires some "user activity" to restart the
# timer which will cause a subsequent suspend attempt, so in addition to
# creating or removing $INHIBITFILE this script also jiggles the mouse after
# removing the file to restart the timer.
# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity()
{
/usr/sbin/nfsstat --server --list
}
# Slightly jiggle the mouse pointer about; we do a small step and reverse step
# to try to stop this being annoying to anyone using the PC.
function jiggle_mouse()
{
export DISPLAY=:0.0
xdotool mousemove_relative --sync -- 1 1
xdotool mousemove_relative --sync -- -1 -1
}
LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"
INHIBITFILE="$HOME/tmp/nfs-suspend-blocker.inhibit"
echo "$0: Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
check_activity > "$ACTIVITYFILE1"
exit 0;
fi
/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"
if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
echo "$0: No activity detected since last run" >> "$LOG"
if [ -f "$INHIBITFILE" ]; then
echo "$0: Removing suspend inhibit file and jiggling mouse" >> "$LOG"
/bin/rm "$INHIBITFILE"
jiggle_mouse
fi
else
echo "$0: Activity detected since last run; inhibiting suspend" >> "$LOG"
touch "$INHIBITFILE"
fi
Antworten:
Ein Programm, um Ihren Computer wach zu halten, ist Koffein . Ich würde eine .bash_aliases-Datei erstellen, um auch Koffein aufzurufen, wenn Ihr ursprünglicher Code aufgerufen wird.
Abhängig davon, für welchen Code Sie Ihren Computer wach halten möchten, müssen Sie ein benutzerdefiniertes Skript erstellen, das das Abtöten von Koffein umfasst, wenn der andere Code gestoppt wird. Einige weitere Details zum jeweiligen Code würden helfen.
Update: Eine einfachere Möglichkeit wäre, xdotool auszuführen , mit dem installiert werden kann
sudo apt-get install xdotool
. Sie können ein Skript schreiben, das aufgerufen wird, wenn Ihr Zielcode geöffnet wird, und dann densleep
Befehl 29 Minuten lang verwenden und dann ausführenxdotool key a
oder etwas beliebiges ausführen , um den Computer wach zu halten.quelle
Wenn
Warum dann nicht einfach mit dem Mauszeiger wackeln, nachdem die Anwendung beendet wurde?
Zusammenfassen:
Dies wird den Bildschirmschoner nicht behindern.
Das einzige Problem ist, dass es 30 Minuten nach Beendigung des Prozesses dauert, wenn das System angehalten wird. Dies ist auch bei Ihrer 'EDIT'-Lösung der Fall.
PS: Ich habe nach einer Lösung für ein ähnliches Problem gesucht, als ich auf dieser Seite von xdotool erfahren habe. So danke. Hoffe das hilft.
quelle
pm-utils
dazu hat geholfen. Beachten Sie, dass das Paketpm-utils
installiert werden muss, damit dies funktioniert. Das Verzeichnis selbst kann auch dann vorhanden sein, wenn das Paket nicht installiert ist.Obwohl EDIT 2 den Bildschirmschoner einschalten lässt und den Autosuspend-Dienst beim Entfernen der Sperrdatei wieder aufnimmt, dauert es 30 Minuten nach dem Entfernen der Datei, bis das System angehalten wird.
Eine mögliche Lösung besteht darin, die integrierte Funktion zum automatischen Bildschirmschoner und zum automatischen Anhalten zu deaktivieren, sie selbst zu implementieren und das Verhalten des Timers nach Bedarf auszuwählen. Der Befehl xprintidle(Möglicherweise müssen Sie dies installieren.) Gibt die Anzahl der Millisekunden aus, für die keine Tastatur- oder Mausaktivität stattgefunden hat. Dies eröffnet mehrere Möglichkeiten. Ich habe den folgenden Inaktivitätsmanager in Python implementiert (kein allzu großer Bash-Scripter). Zu den Funktionen gehören das Festlegen des Befehls, des Timeouts und der Sperrdatei (ich habe sie als Sperre bezeichnet) für Bildschirmschoner und / oder Autosuspend. Darüber hinaus können Sie auswählen, ob der Inaktivitäts-Timer neu gestartet werden soll, wenn die Sperrdatei entfernt wird oder nicht (das Verhalten kann für Suspend und Bildschirmschoner unterschiedlich sein). Ich habe versucht, die Verwendung in den Notizen klar zu machen, aber wenn etwas unklar ist, fragen Sie.
Verwendungszweck:
inactivitymanager &
Fügen Sie einfach zu .profile oder .xsessionrc im Home-Verzeichnis hinzu (sehen Sie, welches für Sie funktioniert. Fügen Sie nicht beide hinzu, da sonst zwei Instanzen dieses Skripts gleichzeitig ausgeführt werden, was ich nicht behandelt habe. Ich denke, es liegt in diesen Details dass die Mainstream-Implementierungen die benutzerdefinierten übertreffen).Wie die Sperrdatei dorthin gelangt, bleibt vorerst der Vorstellungskraft des Benutzers überlassen (wenn ich mich dazu bringe, einen Daemon dafür zu implementieren, werde ich dies in eine EDIT auf diese Antwort einfügen). Sie (OP) haben es natürlich für Ihren Fall gelöst. Eine Gefahr, die Sie vermeiden sollten, wenn Sie versuchen, das Anhalten für mehr als einen Prozess zu verhindern, ist das Löschen der Sperrdatei, wenn ein Prozess beendet wird, während ein anderer noch ausgeführt wird. Alternativ kann das Skript leicht bearbeitet werden, um das Anhalten zu verhindern, wenn eine Datei in einem bestimmten Verzeichnis (einem Sperrverzeichnis) vorhanden ist. Auf diese Weise kann jeder Prozess eine eigene Sperrdatei haben.
Anmerkungen:
quelle