Ich habe einen Server, der aus Sicherheitsgründen normalerweise ausgeschaltet ist. Wenn ich daran arbeiten möchte, schalte ich es ein, führe meine Aufgaben aus und fahre es wieder herunter. Meine Aufgaben dauern in der Regel nicht länger als 15 Minuten. Ich möchte einen Mechanismus implementieren, der es nach 60 Minuten automatisch herunterfährt.
Ich habe nachgeforscht, wie das mit cron geht, aber ich glaube nicht, dass dies der richtige Weg ist, da cron nicht berücksichtigt, wann der Server das letzte Mal eingeschaltet wurde. Ich kann nur periodische Muster festlegen, aber diese berücksichtigen diese Daten nicht.
Wie könnte ich diese Implementierung durchführen?
at
(einmalige Ausführung).sudo shutdown -h +60
starten, der einen Countdown-Zähler von 60 Minuten für den Herunterfahren (-halt) -Prozess startet. Wenn du es abbrechen willst, kannst dusudo shutdown -c
(das benutzt zwar kein Cron)Antworten:
Wenn Sie Ihre Aufgaben jedes Mal als derselbe Benutzer ausführen, können Sie einfach den Befehl shutdown (optional mit der Option -P) zu Ihrem Profil hinzufügen. Die Zahl steht für die Anzahl der Minuten, um die der Befehl zum Herunterfahren verzögert wird. Stellen Sie sicher, dass Ihr Benutzer den Befehl shutdown über sudo ohne Kennwort ausführen kann.
quelle
shutdown -k -P 3600
vsshutdown -k -P 60
(-k
druckt die Nachricht an der Wand, hat aber keine andere Wirkung)Es gibt mehrere Möglichkeiten.
Geben Sie Ihre Zeit direkt an
shutdown -P
:Beachten Sie, dass die
shutdown
Manpage auch Folgendes hervorhebt:Verwenden
at
Befehl.Erstellen Sie eine System-Unit-Datei oder ein Init-Skript, das
shutdown -P 60
beim Start ausgeführt wird.Verwenden Sie cron's
@reboot
, um den Befehl nach dem Booten auszuführen.Zu (root) crontab hinzufügen:
Bei den letzten beiden Methoden können Sie auch
sleep 3600 && shutdown -P now
anstelle des Zeitarguments verwendenshutdown
, um das Herunterfahren um 60 Minuten zu verzögern. Auf diese Weise sind Anmeldungen bis zum letzten Moment vor dem Herunterfahren möglich.quelle
sleep
Befehl müssen Sie noch eine Zeit angeben, bisshutdown
- wir würdennow
für dieses Argument verwenden, wenn wir bereits gewartet haben (aber beachten Sie, dass Sie nicht sehr gewarnt werden, wenn Sie Ihre Arbeit davor speichern verschwindet unter dir!).shutdown -P 60
funktioniert, ist es nicht die Art und Weise, wie der Befehl aufgerufen werden sollte. Laut der Manpage solltest du verwendenshutdown -P +60
. --- Auch das Herunterfahren ohne Zeitargument (im Beispielsleep 3600 && shutdown -P
) wird um eine Minute verzögert (likeshutdown -P +1
). Wie Toby Speight schrieb, würden Sie wahrscheinlich verwenden wollenshutdown -P now
.Das sieht nach einem XY-Problem aus .
Wenn Sie nach 60 Minuten herunterfahren, besteht die Gefahr, dass Sie ein besonders kompliziertes Problem haben und einfach mehr Zeit benötigen. Viele der vorherigen Lösungen würden es nicht leicht machen, das Herunterfahren zu verzögern.
Wenn es sich bei der Aufgabe nicht um eine interaktive Aufgabe handelt, sondern um eine Skriptaufgabe, die automatisch von einem anderen Computer ausgelöst wird, hat @sdkks eine hervorragende Lösung für diese Aufgabe gefunden . Sie sollten der Maschine einfach die Aufgabe erteilen, das Ausschalten auszuführen, sobald das Skript und alle seine Aufgaben abgeschlossen sind.
Wenn es sich bei Ihrer Aufgabe jedoch um eine interaktive Aufgabe handelt, würde ich vorschlagen, stattdessen die Leerlauferkennung durchzuführen.
Wenn Sie Ihre Aufgabe in einer GUI (X11) ausführen, können Sie die inaktiven GUI-Sitzungen anhand des hier beschriebenen Ansatzes erkennen: Führen Sie einen Befehl aus, wenn das System inaktiv ist und wenn es wieder aktiv ist
Wenn Sie die Aufgabe über ein Terminal ausführen, können Sie mit dem
who
Befehl angemeldete Benutzer erkennen . Sie können einen Cronjob einrichten, der den Computer herunterfährt, wennwho
ein leeres Ergebnis zurückgegeben wird. Beachten Sie, dass dies ein recht konservativer Ansatz ist. Das System wird nicht heruntergefahren, wenn Sie die Konsole angeschlossen haben, sondern im Leerlauf.Wenn Sie aggressiver sein und auch inaktive Terminalsitzungen trennen möchten, können Sie den vorherigen Ansatz mit dem automatischen Trennen inaktiver SSH-Sitzungen
ClientAliveInterval
und kombinierenClientAliveCountMax
. Ein anderer Ansatz für diesen Fall, wenn Sie nicht über SSH, sondern über eine lokale Terminalsitzung verfügen, besteht darin, die vom Befehl zurückgegebene Leerlaufzeit des Terminals zu verwendenw
.quelle
Die vorherigen Antworten hier erfüllen zwar alle die Anforderung nach Perfektion, Sie können die Maschine jedoch auch ausschalten, sobald die Aufgaben erledigt sind.
bash
Skripte könnentrap
ped sein, was bedeutet, dass bestimmte Signale abgefangen und bestimmte Aufgaben bei Bedarf ausgeführt werden können.EXIT
ist eines der Signale, die abgefangen werden können.Sie könnten:
trap
fürEXIT
Ihre automatisierten Shell-Skripte fest, was bedeutet, dass Ihre automatisierten Aufgaben beendet werdentrap
für fest.bashrc
EXIT
, dh schalten Sie den Computer aus, wenn Sie sich von diesem Computer abmelden.Option 1 wäre der ideale Fall, vorausgesetzt, Ihre Aufgaben erfordern keine Ad-hoc-Prüfung und manuelle Beurteilung.
Option 2 würde die Fälle abdecken, in denen Sie vergessen würden, das Terminal zu verlassen, ohne es auszuschalten. Es gibt jedoch eine Einschränkung; Wenn mehrere Terminals für dasselbe Gerät geöffnet sind und Sie eines verlassen, wird das Gerät trotzdem ausgeschaltet. (Es kann ein Skript erstellt werden, um dies zu vermeiden, aber ich werde die Lösung nicht komplizieren.)
Dies kann am Ende von
.bashrc
Option 2 sein, an einer Stelle am oberen Rand Ihres Skripts für Option 1.Warum nicht
poweroff
am Ende des Skripts verwenden?Ich bevorzuge es,
set -eo pipefail
oben in meinen Skripten zu verwenden. Wenn ein Fehler auftritt, schlägt dieser nicht unbemerkt fehl. Es werden keine weiteren Befehle mehr ausgeführt.trap
ofEXIT
signal sollte die Fälle abdecken, in denen das Skript aufgrund von Fehlern vorzeitig beendet wird.Für Ihre Aufgaben kann dies jedoch auch bedeuten, dass die Maschine heruntergefahren wird, bevor sie abgeschlossen sind.
Ich verwende eine einfache
bash
Vorlage, um das Debuggen von Skripten zu vereinfachen. Vielleicht könnte es von Nutzen sein. Bitte sehen Sie diesen Kern .quelle
.bashrc
ich den Boden vorziehen würde, falls etwas anderes ihn überschreibt. Ihr Anliegen scheint nicht klar zu sein. Können Sie vielleicht ein Beispiel-Snippet auf repl.it veröffentlichen?Wenn Sie auf @dirkt comment eingehen, können Sie einen
at
Befehl in Ihre.bashrc
oder eine beliebige.profile
Datei einfügen, die Ihre Shell bei der Anmeldung verwendet, um ein automatisches Herunterfahren 60 Minuten nach Ihrer Anmeldung zu planen.Etwas wie:
quelle
at
. Sie können auchat
Aufgaben in/var/spool/
at
in diesem Zusammenhang davon abraten, da es Neustarts übersteht. Wenn sich OP anmelden, manuell herunterfahren und sich dann innerhalb einer Stunde erneut anmelden würde, würde er vor Ablauf einer Stunde nach seiner letzten Anmeldung beim ersten geplanten Herunterfahren gestartet.Der folgende Befehl wird
command
mit Parametern ausgeführt. Wenn der Vorgang erfolgreich abgeschlossen wurde, wird das Kontrollkästchen sofort deaktiviert, sofern der Benutzer ausgeführt werden kannpoweroff
. Es muss möglicherweise verwendet werdensudo poweroff
.Während der folgende einfach
poweroff
sofort ausgeführt wird, wenn der Befehl beendet wird:Wenn Sie der Meinung sind, dass der Befehl nach Abschluss eine Ruhezeit benötigt, führen Sie ihn aus
Wenn Sie glauben, dass der Befehl über die Zeit hinaus ausgeführt wird, können Sie ihn auf eine Stunde beschränken:
timeout
ist Teil descoreutils
Pakets, also haben Sie es wahrscheinlich bereits.quelle
Wenn Sie sich wirklich Sorgen um die Sicherheit machen, verwenden Sie einen mechanischen Auslasstimer an der Stromquelle. Stellen Sie einfach die Zeit ein, zu der das System heruntergefahren werden soll. Auf diese Weise kann sich niemand remote anmelden und das Herunterfahren deaktivieren. Sie benötigen physischen Zugang.
quelle
Wenn Sie sich in einer
systemd
Maschine befinden, können Sie einen monotonen Timer verwendenDie Timer-Einheit
/etc/systemd/system/shutdown_after_an_hour.timer
Die Timer-Einheit
/etc/systemd/system/shutdown_after_an_hour.service
:Es wird über aktiviert
Sein Status (insbesondere wie viel Zeit bis zum Herunterfahren verbleibt) ist über verfügbar
Es wird beim nächsten Neustart funktionieren, es ist
systemctl start
während der Sitzung, in der es erstellt wird, nicht nützlich, da es entweder nicht funktioniert (weil es beim Neustart nicht ausgelöst wurde) oder den Computer sofort herunterfährt, wenn es länger als eine Stunde dauert. Ich weiß nicht, welches tatsächlich passieren wird, ich habe diesen speziellen Fall nie getestet.quelle
Versuchen Sie, das Skript (
sudo shutdown -P 3600
) im/etc/init.d
Verzeichnis abzulegen, damit es beim Start automatisch ausgeführt wird.Oder versuchen Sie es mit
anacron
, indem Sie den Befehl in die/etc/anacrontab
Datei einfügen. Ich schlage auch vor,nohup
vor dem Befehl zu verwenden, um sicherzustellen, dass der Befehl nach dem Abmelden noch funktioniert.quelle
Nutzen Sie die Logout-Datei Ihrer Shell
Wenn Sie den Server nur für interaktive oder nicht interaktive Aufgaben benötigen, die von Ihrer UID gestartet werden, sollten Sie Ihre Befehle zum Herunterfahren in Ihre Datei ~ / .bash_logout einfügen . Das GNU Bash Manual sagt:
Wenn Sie also "sudo poweroff" oder ähnliches zu Ihrer Abmeldedatei hinzufügen, wird der Server ausgeschaltet , sobald Sie sich von Ihrer aktuellen Sitzung abmelden oder wenn eine nicht interaktive Bash-Sitzung aufgerufen wird
exit
. Sie könnten auch verwenden wählen zu oder eine Zeitverzögerung passieren Abschaltung , wenn Sie die Abschaltung verschieben würden es vorziehen.Um dies interaktiver zu gestalten, können Sie die folgenden Bashisms in Ihre Logout-Datei einfügen:
Vorbehalte
Es gibt einige Einschränkungen, die Sie bei dieser Lösung beachten sollten:
startx
oder ähnlich gestartet wurde .exit
, kann es zu unerwarteten Herunterfahren kommen.NOPASSWD
Befehle zum Herunterfahren nicht angegeben odersudo -v
vor dem Ausführen des Befehls zum Herunterfahren nicht angerufen haben .Kurz gesagt, möchten Sie vielleicht überlegen, ob dieser Ansatz Ihren tatsächlichen Anforderungen entspricht oder ob ein völlig anderer Ansatz wie die Überwachung auf Abwesenheit angemeldeter Benutzer oder eine andere Alternative besser geeignet ist. Ihr Kilometerstand wird auf jeden Fall variieren.
quelle