it-swarm.com.de

Gibt es eine Möglichkeit, einen laufenden Prozess auf Linux-Systemen anzuhalten und später fortzusetzen?

Ich muss Dateien auf einen Computer kopieren. Und die Daten sind immens groß. Jetzt müssen Server normal bedient werden, und auf diesen gibt es normalerweise einen bestimmten Bereich von Stoßzeiten. Gibt es also eine Möglichkeit, solche Befehle so auszuführen, dass der Prozess angehalten wird, wenn der Server geschäftige Stunden erreicht, und wenn er diesen Bereich verlässt, wird er fortgesetzt?

Vorgesehenes Ergebnis

cp src dst

if time between 9:00-14:00 pause process
After 14:00 resume cp command.
38
Sollosa

Ja, Sie müssen die Prozess-ID des zu pausierenden Prozesses abrufen (über den Befehl ps) und dann Folgendes tun:

$> kill -SIGSTOP <pid>

Der Prozess wird dann mit dem Status "T" (in ps) angezeigt.

Um fortzufahren, führen Sie Folgendes aus:

$> kill -CONT <pid>
10
gerhard d.

Sie können die Ausführung eines Prozesses anhalten, indem Sie ihm ein SIGSTOP-Signal senden und ihn später fortsetzen, indem Sie ihm ein SIGCONT senden.

Angenommen, Ihre Arbeitslast ist ein einzelner Prozess (keine Fork-Helfer werden im Hintergrund ausgeführt), können Sie Folgendes verwenden:

# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid

Wenn die geschäftige Zeit beginnt, senden Sie ihr einen SIGSTOP:

# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"

Wenn der Server später wieder inaktiv ist, setzen Sie ihn fort.

# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"

Sie müssen dies für bestimmte Zeiten planen, zu denen es ausgeführt werden soll. Sie können Tools wie Cron- oder Systemd-Timer (oder eine Vielzahl anderer ähnlicher Tools) verwenden, um dies zu planen. Anstatt die Planung anhand eines Zeitintervalls zu planen, können Sie den Server überwachen (möglicherweise anhand des Lastdurchschnitts, der CPU-Auslastung oder der Aktivität aus den Serverprotokollen), um zu entscheiden, wann die Kopie angehalten/fortgesetzt werden soll.

Sie müssen auch die PID-Datei verwalten (falls Sie eine verwenden), sicherstellen, dass Ihre Kopie tatsächlich noch ausgeführt wird, bevor Sie sie anhalten. Möglicherweise möchten Sie sie bereinigen, indem Sie die PID-Datei entfernen, sobald die Kopie fertig ist usw.

Mit anderen Worten, Sie benötigen mehr, um eine zuverlässige Funktion zu gewährleisten. Die Grundidee, diese SIGSTOP- und SIGCONT-Signale zum Anhalten/Fortsetzen der Ausführung eines Prozesses zu verwenden, scheint jedoch genau das zu sein, wonach Sie suchen.

77
filbranden

Anstatt den Prozess anzuhalten, können Sie ihm auch eine niedrigere Priorität zuweisen:

renice 19 "$pid"

gibt ihm die niedrigste Priorität (höchste Freundlichkeit), so dass der Prozess die CPU anderen Prozessen übergibt, die sie die meiste Zeit benötigen.

Unter Linux kann dasselbe mit E/A mit ionice gemacht werden:

ionice -c idle -p "$pid"

Setzt den Prozess in die Klasse "idle", so dass er erhält nur Festplattenzeit, wenn kein anderes Programm für eine definierte Nachfrist nach Festplatten-E/A gefragt hat.

76

Verwenden Sie für dieses Szenario rsync, vergessen Sie cp. Es gibt Parameter, um die Bandbreite zu begrenzen, oder sie können beendet/gestoppt und später gestartet werden

8
Anton Tománek

Wenn Sie dies tun, indem Sie den laufenden Vorgang unterbrechen, empfehle ich, mit dem Bildschirmprogramm zu spielen. Ich habe Linux schon eine Weile nicht mehr verwendet, aber IIRC, wenn Sie den Befehl nur anhalten und später fortsetzen, sind Sie ziemlich verwundbar. Wenn Sie versehentlich abgemeldet werden, können Sie Ihre Sitzung nicht fortsetzen.

Ich glaube, Sie können die Sitzung mit dem Bildschirm unterbrechen, dann trennen und sich abmelden. Später können Sie wieder zu dieser Sitzung zurückkehren. Sie müssten ein bisschen damit spielen, aber es hat die Sitzungen viel robuster gemacht.

Sie können sich auch abmelden und nach Hause gehen, sich dann remote anmelden, sich wieder an das System anschließen, das Sie im Büro gestartet haben, und es für den Abend wieder aufnehmen und es am nächsten Arbeitstag wieder abholen.

3
Bill K

Wenn Ihre Shell dies unterstützt (fast alle tun dies), können Sie ^ Z (Strg + Z) drücken, um einfach ein SIGTSTP - Signal an die Vordergrundaufgabe zu senden, und es dann mit fg (im Vordergrund) fortsetzen ) oder bg (im Hintergrund).

Wenn Sie dies für mehrere Aufgaben tun und später zu ihnen zurückkehren möchten, können Sie den Befehl jobs verwenden und dann mit fg/bg %# Zurückgeben, wobei # die in Klammern für Jobs angegebene Zahl ist.

Denken Sie daran, dass SIGTSTP etwas anders ist als SIGSTOP (das für alle anderen Antworten verwendet wird), vor allem aufgrund der Tatsache, dass es ignoriert werden kann (aber ich habe kein gesehen Programm ignoriert es anders als sl). Weitere Details finden Sie unter diese Antwort auf StackOverflow .

0
Ave