Muszę skopiować pliki na maszynie. A dane są niezwykle duże. Teraz serwery muszą normalnie obsługiwać, a na nich zazwyczaj jest określony zakres godzin pracy. Czy jest więc sposób na uruchomienie takich poleceń w taki sposób, że jeśli serwer osiągnie godziny pracy, wstrzymuje proces, a kiedy wychodzi poza ten zakres, wznawia go?
Wynik zamierzony
cp src dst
if time between 9:00-14:00 pause process
After 14:00 resume cp command.
process
process-management
Sollosa
źródło
źródło
cp -al
do stworzenia farmy z twardymi linkami? Lub użyj systemu plików, który obsługuje odnośniki na poziomie bloku z kopiowaniem przy zapisie, używająccp -a --reflink=auto
? BTRFS i ZFS obsługują kopie na tym samym urządzeniu fizycznym.src
zmienia się między 9:00 a 14:00? Jeśli tak, po prostu wstrzymanie i wznowieniecp
procesu może spowodować uszkodzenie plików. Może być lepiej uruchomićrsync
w połączeniu ztimeout
poleceniem.Odpowiedzi:
Tak, musisz
Proces wyświetli się ze statusem „T” (PS). Aby kontynuować, zrób
Powodzenia!
źródło
Możesz wstrzymać wykonywanie procesu, wysyłając mu sygnał SIGSTOP, a następnie wznowić, wysyłając mu sygnał SIGCONT.
Zakładając, że obciążenie jest pojedynczym procesem (nie rozwidla pomocników działających w tle), możesz użyć czegoś takiego:
Następnie, gdy rozpocznie się zajęty czas, wyślij mu SIGSTOP:
Później, gdy serwer będzie ponownie bezczynny, wznów go.
Będziesz musiał zaplanować to na określone czasy, kiedy chcesz to wykonać, możesz użyć narzędzi, takich jak cron lub systemd timery (lub wiele innych podobnych narzędzi), aby zaplanować to. Zamiast planowania na podstawie przedziału czasu, możesz monitorować serwer (być może patrząc na średnie obciążenie, użycie procesora lub aktywność z dzienników serwera), aby zdecydować, kiedy wstrzymać / wznowić kopiowanie.
Musisz także zarządzać plikiem PID (jeśli go używasz), upewnij się, że kopia jest nadal uruchomiona przed wstrzymaniem, prawdopodobnie będziesz chciał wyczyścić, usuwając plik pid po zakończeniu kopiowania itp.
Innymi słowy, potrzebujesz więcej w tym celu, aby uzyskać wiarygodny, ale wydaje się, że szukasz podstawowego pomysłu wykorzystania tych sygnałów SIGSTOP i SIGCONT do wstrzymania / wznowienia wykonania procesu.
źródło
Zamiast zawieszać proces, możesz również nadać mu niższy priorytet:
nada mu najniższy priorytet (najwyższą niezawodność), dzięki czemu proces da procesor innym procesom, które go potrzebują przez większość czasu.
W systemie Linux to samo można zrobić z I / O za pomocą
ionice
:Umieści proces w klasie „bezczynności”, dzięki czemu uzyska czas na dysku tylko wtedy, gdy żaden inny program nie poprosił o dyskowe operacje we / wy przez określony okres karencji .
źródło
W tym scenariuszu użyj rsync, zapomnij o cp. istnieją parametry, które ograniczają pasmo, lub można je zabić / zatrzymać i uruchomić później, w sposób, w jaki będzie to kontynuowane, w którym pozostawił google rsync example / s
źródło
Jeśli zamierzasz to zrobić, przerywając uruchomiony proces, sugeruję grę z programem Screen. Od jakiegoś czasu nie używałem Linuksa, ale IIRC po prostu wstrzymuje polecenie i wznawia je później, co czyni cię dość wrażliwym, jeśli przypadkowo się wylogujesz, nie będziesz mógł wznowić sesji.
Wydaje mi się, że z screenem możesz przerwać sesję, a następnie ją odłączyć i wylogować. Później możesz wrócić i ponownie dołączyć do tej sesji. Trzeba by się z tym trochę pobawić, ale dzięki temu sesje są znacznie bardziej niezawodne.
Możesz także wylogować się i wrócić do domu, a następnie zalogować się zdalnie, ponownie podłączyć do systemu uruchomionego w biurze i wznowić go wieczorem, a następnie odebrać go następnego dnia w pracy.
źródło
Jeśli twoja powłoka go obsługuje (prawie wszyscy tak robią), możesz nacisnąć ^ Z (Ctrl + Z), aby łatwo wysłać
SIGTSTP
sygnał do zadania na pierwszym planie, a następnie kontynuować zfg
(na pierwszym planie) lubbg
(w tle).Jeśli zrobisz to dla wielu zadań i chcesz wrócić do nich później, możesz użyć
jobs
polecenia, a następnie wrócić za pomocąfg/bg %#
, gdzie # to liczba podana w nawiasach na zadaniach.Pamiętaj, że
SIGTSTP
jest nieco inny niżSIGSTOP
(który jest używany we wszystkich innych odpowiedziach), co najważniejsze, ponieważ można go zignorować (ale nie widziałem, aby program ignorował to inaczej niżsl
). Więcej szczegółów można znaleźć w tej odpowiedzi na StackOverflow .źródło