Ich muss Dateien auf eine Maschine kopieren. Und die Daten sind immens groß. Jetzt müssen Server normal arbeiten, und normalerweise gibt es einen bestimmten Bereich an geschäftigen Stunden. Gibt es eine Möglichkeit, solche Befehle so auszuführen, dass der Server den Prozess anhält, wenn er überlastet ist, und ihn fortsetzt, wenn er diesen Bereich verlässt?
Vorgesehenes Ergebnis
cp src dst
if time between 9:00-14:00 pause process
After 14:00 resume cp command.
process
process-management
Sollosa
quelle
quelle
cp -al
eine Hardlink-Farm erstellen? Oder verwenden Sie ein Dateisystem, das Block-Level-Reflinks mit Copy-on-Write unterstütztcp -a --reflink=auto
. BTRFS und ZFS unterstützen dies für Kopien innerhalb desselben physischen Geräts.src
Wechselt eine der Dateien zwischen 9:00 und 14:00? Wenn dies der Fall istcp
, kann das Anhalten und Fortsetzen des Vorgangs zu beschädigten Dateien führen. Es kann besser sein,rsync
in Kombination mit demtimeout
Befehl auszuführen .Antworten:
Ja, das musst du
Der Vorgang wird dann mit dem Status "T" (PS) angezeigt. Um fortzufahren, mache a
Viel Glück!
quelle
Sie können die Ausführung eines Prozesses anhalten, indem Sie ihm ein SIGSTOP-Signal senden und ihn später wieder aufnehmen, indem Sie ihm ein SIGCONT senden.
Angenommen, Ihre Workload ist ein einzelner Prozess (keine im Hintergrund ausgeführten Fork-Helfer), können Sie Folgendes verwenden:
Dann, wenn die geschäftige Zeit beginnt, senden Sie es ein SIGSTOP:
Wenn der Server später wieder inaktiv ist, setzen Sie ihn fort.
Sie müssen dies für bestimmte Zeiten planen, wenn Sie möchten, dass es ausgeführt wird. Sie können Tools wie Cron- oder System-Timer (oder eine Vielzahl ähnlicher Tools) verwenden, um dies zu planen. Anstatt die Planung auf Basis eines Zeitintervalls vorzunehmen, können Sie den Server überwachen (z. B. anhand des Lastdurchschnitts, der CPU-Auslastung oder der Aktivität in den Serverprotokollen), um zu entscheiden, wann die Kopie angehalten oder fortgesetzt werden soll.
Sie müssen auch die PID-Datei verwalten (falls Sie eine verwenden), um sicherzustellen, dass Ihre Kopie tatsächlich noch ausgeführt wird, bevor Sie sie anhalten. Möglicherweise möchten Sie eine Bereinigung durchführen, indem Sie die PID-Datei entfernen, sobald die Kopie fertig ist usw.
Mit anderen Worten, Sie benötigen mehr Informationen, 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.
quelle
Anstatt den Prozess anzuhalten, können Sie ihm auch eine niedrigere Priorität zuweisen:
Gibt ihm die niedrigste Priorität (höchste Priorität), sodass dieser Prozess die CPU für andere Prozesse freigibt, die ihn die meiste Zeit benötigen.
Unter Linux kann dasselbe mit I / O gemacht werden mit
ionice
:Versetzt den Prozess in die "Leerlauf" -Klasse, sodass er nur dann Festplattenzeit erhält, wenn kein anderes Programm für eine definierte Nachfrist nach Festplatten-E / A gefragt hat .
quelle
Verwenden Sie für dieses Szenario rsync und vergessen Sie cp. Es gibt Parameter, die die Bandbreite begrenzen oder die beendet und später gestartet werden können
quelle
Wenn Sie den laufenden Prozess unterbrechen, empfehle ich, mit dem Screen-Programm zu spielen. Ich habe Linux schon eine Weile nicht mehr verwendet, aber wenn Sie den Befehl in IIRC pausieren 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 screen unterbrechen, trennen und sich abmelden. Später können Sie wieder in diese Sitzung zurückkehren und sie erneut verbinden. Man müsste ein bisschen damit spielen, aber es hat die Sitzungen viel robuster gemacht.
Sie können sich auch abmelden und nach Hause gehen, sich dann per Fernzugriff anmelden, das System wieder anschließen, das Sie im Büro gestartet haben, und es für den Abend fortsetzen. Am nächsten Arbeitstag können Sie es dann wieder abholen.
quelle
Wenn Ihre Shell dies unterstützt (fast alle tun dies), können Sie ^ Z (Strg + Z) drücken, um auf einfache Weise ein
SIGTSTP
Signal an die Vordergrundaufgabe zu senden. Fahren Sie dann mitfg
(im Vordergrund) oderbg
(im Hintergrund) fort.Wenn Sie dies für mehrere Aufgaben tun und später darauf zurückgreifen möchten, können Sie den
jobs
Befehl verwenden und dann mit zurückkehrenfg/bg %#
, wobei # die Zahl ist, die in Klammern für Aufträge angegeben ist.Denken Sie daran, dass dies
SIGTSTP
etwas anders ist alsSIGSTOP
(was bei allen anderen Antworten verwendet wird), vor allem aufgrund der Tatsache, dass es ignoriert werden kann (aber ich habe kein Programm gesehen, das es außer ignoriertsl
). Weitere Details zu dieser Antwort finden Sie auf StackOverflow .quelle