Чи є спосіб призупинити запущений процес у системах Linux і відновити його пізніше?


37

Я маю копіювати файли на машину. І даних надзвичайно багато. Тепер сервери повинні нормально обслуговуватись, і зазвичай на них є певний діапазон напружених годин. Так чи є спосіб запускати такі команди таким чином, що якщо сервер потрапляє на напружені години, він призупиняє процес, і коли він виходить з цього діапазону, він відновить його?

Передбачуваний результат

cp src dst

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

22
rsync може відновити часткові трансфери
Thorbjørn Ravn Andersen

2
Вам потрібні фактичні дані, щоб скопіювати їх як резервну копію? Якщо ні, ви могли б використати cp -alдля створення ферми жорсткої посилання? Або використовувати файлову систему, яка підтримує блокові зворотні посилання з копією під час запису, використовуючи cp -a --reflink=auto? BTRFS та ZFS підтримують копії в одному фізичному пристрої.
Пітер Кордес

9
Чи srcзмінюється якийсь із файлів між 9:00 та 14:00? Якщо так, просто призупинення та відновлення cpпроцесу може призвести до пошкодження файлів. Можливо, краще запустити rsyncв поєднанні з timeoutкомандою.
Марк Плотнік

Звідки і куди копіюються файли? Це віртуальна система? Що таке вихідна файлова система? Яка мета копії?
Брайам

@Braiam Im, використовуючи rsync та копіюючи файли з віддаленого на локальну машину. Я просто використав команду cp як приклад тут btw
Sollosa

Відповіді:


7

Так, потрібно

acquire the process id of the process-to-paus (PS), then do
$> kill -SIGSTOP <pid>

Потім процес з’явиться зі статусом «T» (PS). Щоб продовжити, зробіть

$> kill -CONT <pid>

Щасти!


77

Ви можете призупинити виконання процесу, надіславши йому сигнал SIGSTOP, а потім пізніше відновити його, надіславши SIGCONT.

Якщо припустити, що ваше навантаження - це єдиний процес (не працює вилами помічників), ви можете використовувати щось подібне:

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

Потім, коли розпочнеться час зайнятості, надішліть його SIGSTOP:

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

Пізніше, коли сервер знову не працює, відновіть його.

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

Вам потрібно буде запланувати це на певний час, коли ви хочете його виконати, ви можете використовувати такі інструменти, як таймери cron або systemd (або різноманітні інші подібні інструменти) для планування цього плану. Замість планування, заснованого на часовому інтервалі, ви можете вибрати моніторинг сервера (можливо, дивлячись на середню завантаженість, використання процесора або активність з журналів сервера), щоб прийняти рішення, коли призупинити / відновити копію.

Вам також потрібно керувати файлом PID (якщо ви його використовуєте), переконайтесь, що ваша копія дійсно все ще працює, перш ніж призупинити її, ймовірно, ви захочете очистити, видаливши pidfile, коли копія закінчиться і т.д.

Іншими словами, вам потрібно більше цього зробити для надійного, але основна ідея використання цих сигналів SIGSTOP і SIGCONT для призупинення / відновлення виконання процесу, здається, саме те, що ви шукаєте.



1
Можливо, додайте нагадування, що ви повинні бути дуже обережними, що '/var/run/bigcopy.pid' все ще відноситься до того ж процесу, що і ви вважаєте, що це відбувається. випадкове зупинення інших процесів у системі може бути небажаним. Я не знаю жодного безпечного способу гарантувати, що під посилається на програму, яку ви вважаєте, що це робить ...
Еван Бенн,

@EvanBenn Так, це я мав на увазі так, щоб переконатися, що ваша копія все ще працює, перш ніж призупинити її, хоча ваша думка, безумовно, більш чітка, ніж це! Так, перевірка PID - це сама по собі гонка, так що іноді це неможливо зробити на 100% надійніше ...
filbranden

@cat Насправді процес не може блокувати SIGSTOP. Дивіться посилання з першого коментаря: "SIGSTOP - це незаблокований сигнал на зразок SIGKILL" (або просто гугл його, ви побачите, що так)
filbranden

76

Замість того, щоб призупиняти процес, ви можете також надати йому нижчий пріоритет:

renice 19 "$pid"

надасть йому найнижчий пріоритет (найвища приємність), так що цей процес дасть процесор іншим процесам, які потребують цього більшу частину часу.

У Linux те ж саме можна зробити і з введенням / виводу за допомогою ionice:

ionice -c idle -p "$pid"

Покладе процес у клас "простою", щоб він отримав дисковий час лише тоді, коли жодна інша програма не запитала введення / виведення диска протягом визначеного періоду пільги .


22
Це типовий випадок проблеми XY . Питання полягало в тому, як призупинити процес, але це не відповідає на питання. Хоча дійсно нижчий пріоритет є кращим підходом до актуальної проблеми, він не відповідає на питання. Я б відредагував це питання, щоб також було вказано, як призупинити процес і чому пауза може бути проблемою (наприклад, файл можна редагувати під час паузи).
MechMK1

22
@DavidStockinger, технічно ця відповідь говорить про те, як сказати ОС призупинити процес, коли він (ОС, процесор, планувальник вводу / виводу) зайнятий (навіть якщо це за частки секунд за раз). Як призупинити процес вручну, вже розглядалося в інших відповідях. Це рішення не стосується проблеми модифікації файлів під час їх копіювання.
Стефан Шазелас

5
Зміна пріоритету вводу-виводу не завжди є найкращим рішенням. Якщо ви копіюєте з спінінг-дисків, ви все ще можете шукати перед кожним запитом високого пріоритету, який ви не мали б мати, якщо повністю призупинили операцію з низьким пріоритетом.
Марк

2
Нижній пріоритет проблеми навіть не вирішує. Навіть якщо вікно не працює на кілька секунд або хвилин, це не означає, що величезний процес копіювання, який виселить усе з кешу файлової системи, буде ненав'язливим. Як тільки знову з’явиться навантаження, це буде дуже повільно, підкачуючи все назад.
Р ..

2
@DavidStockinger кращим способом вирішення проблем XY є надання правильного рішення, навіть якщо це не запитання. Коли ви знаєте, що підхід, описаний у питанні, невірний, то хороша відповідь не дає цього неправильного підходу, а натомість пропонує кращий.
тердон

8

Використовуйте rsync, забудьте про cp, для цього сценарію. є парами, що обмежують пропускну здатність, або можуть бути вбиті / зупинені та запущені пізніше, таким чином він продовжиться там, де він залишив google rsync example / s


3

Якщо ви збираєтеся це зробити, перервавши запущений процес, пропоную пограти з програмою Screen. Я не використовував Linux деякий час, але IIRC лише призупинивши команду та відновивши її пізніше залишає вас досить вразливими, якщо випадково вийти з системи, ви не зможете відновити сеанс.

З екрану я вважаю, що ви можете перервати сеанс, а потім відключити його та вийти з системи. Пізніше ви можете повернутися та повторно долучитись до цього сеансу. Вам доведеться трохи пограти з ним, але це зробило сесії набагато більш надійними.

Ви також можете вийти та повернутися додому, потім увійти дистанційно, повторно приєднатись до системи, яку ви почали в офісі, і відновити її на вечір, а потім забрати її знову на наступний день на роботі.


Я вже використовую tmux для tha. Але я пишу сценарій, який би усвідомлював себе чи бажано навколишнє середовище, тому він зупиняється, якщо сервер отримує високий трафік, і продовжую, коли це нормально.
Соллоса

0

Якщо ваша оболонка підтримує це (майже всі), ви можете натиснути ^ Z (Ctrl + Z), щоб легко надіслати SIGTSTPсигнал до завдання переднього плану, а потім продовжити його fg(на передньому плані) або bg(на задньому плані).

Якщо ви робите це для кількох завдань і хочете повернутися до них пізніше, ви можете скористатися jobsкомандою, а потім повернутися з fg/bg %#, де # - це число, вказане в дужках на завданнях.

Майте на увазі, що SIGTSTPце дещо інше, ніж SIGSTOP(що використовується у всіх інших відповідях), головне через те, що його можна ігнорувати (але я не бачив, щоб програма ігнорувала його, крім іншого sl). Більш детальну інформацію можна знайти в цій відповіді на StackOverflow .


Дивно, що жодна відповідь про це ще не згадала.
пр.

Ty Ave, я знаю цю багатозадачність. Але для того, щоб це сталося, потрібно бути на терміналі, тоді як я повинен був створити сценарій, який буде виконувати цю роботу самостійно, незалежно від того, що це займе кілька днів.
Соллоса

@Sollosa це може бути корисно іншим з тим самим питанням та з доступом до терміналу.
пр.

Я згоден. Приємно, що ти знаєш Ave :)
Sollosa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.