Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2023 15:23:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

subprocess.run не ждет завершения процесса rsync

Ematten
скрипт делает бэкап 12 Тб информации в мелких файлах на локальные диски и по сети через ssh. Благодаря тому, что rsync умеет отслеживать изменения перед копированием, это существенно ускоряет процесс и снижает расход трафика.
И что, ты это всё читаешь с экрана потом? Так что направь вывод с rsync в файл.

Потом добавь код такой, который этот файл вывода проверяет на изменения каждые десять секунд. Или там добавь код, который отслеживает процессы rsync в системе. Три процесса там, разделяющие между собой работу. Когда они исчезают, можно выводить текст на экран. Хотя зачем он нужен на экране для двенадцати терабайт? Кто его будет читать такой?

А можешь вообще сделать скрипт на Shell'е, который всё это контролирует, а потом из кода на питоне запускать только этот скрипт. Аргументы ему можно сделать, если у тебя из кода на питоне подаётся что-то разное каждый раз в rsync, скрипт будет просто брать эти аргументы и передать их rsync'у правильно. Но скрипт как раз будет работать столько, сколько надо, пока он там будет rsync в системе обнаруживать. Надо учесть, что rsync'ов в системе может быть несколько разных одновременно от разных задач, и один rsync от другого rsync'а надо тоже уметь отличать.



Офлайн

#2 Май 12, 2023 16:03:58

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1372
Репутация: +  122  -
Профиль   Отправить e-mail  

subprocess.run не ждет завершения процесса rsync

Ematten
Ни тот, ни другой вариант не работают

 subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)¶

Run the command described by args. Wait for command to complete, then return the returncode attribute.
такой вариант как сработает?
  
return_code = subprocess.call(rsync_command)

по идее последующий код должен ждать когда вернется return_code.

или можно ждать лог файл по завершению с результатами, т.е. по нему проверять закончилось выполнение или нет

Офлайн

#3 Май 12, 2023 18:37:03

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

subprocess.run не ждет завершения процесса rsync

А что говорит библиотека на которую я давал ссылку?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#4 Май 13, 2023 01:27:07

Ematten
Зарегистрирован: 2023-03-05
Сообщения: 12
Репутация: +  1  -
Профиль   Отправить e-mail  

subprocess.run не ждет завершения процесса rsync

py.user.next, не понял вопрос. Что читаю? Вывод rsync? Нет, обычно он в non-verbose режиме. Для дебага включил его. По поводу вывода в файл и проверки: решение хорошее, если только мелкие файлы, а если там большой файл и все это по сети идет со скоростью 100 Кб/сек, то лог файл может не изменятся десятками минут. Так что отпадает. Я другой метод пока использую. Проверяю через psutil наличие процессов rsync с общим путем источника. Если они есть в течение 2 секунд при запросах каждые 0,5 секунд, значит процесс еще идет.

xam1816, тоже не работает.

ZerG, не смотрел потроха, но это вроде как обертка над вызовом системного rsync. Тоже не работает.

Отредактировано Ematten (Май 13, 2023 01:27:19)

Офлайн

#5 Май 13, 2023 02:02:45

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

subprocess.run не ждет завершения процесса rsync

Богом клянусь ты делаешь что-то не так
Ситуация рядовая
Я 101 скрипт накатал для рсинка
И все пашет
У тебя рсинк выдает что0то свое так что предложение верное
лови процесс или месаджы от него и обрабатывай
Что-то не так в твоей системе



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#6 Май 13, 2023 03:10:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

subprocess.run не ждет завершения процесса rsync

Ematten
По поводу вывода в файл и проверки: решение хорошее, если только мелкие файлы, а если там большой файл и все это по сети идет со скоростью 100 Кб/сек, то лог файл может не изменятся десятками минут. Так что отпадает. Я другой метод пока использую. Проверяю через psutil наличие процессов rsync с общим путем источника. Если они есть в течение 2 секунд при запросах каждые 0,5 секунд, значит процесс еще идет.
Короче, сделай внешний скрипт на Shell'е (это язык, который есть в Bash и других оболочках, которые соблюдают POSIX). Там используй программы ps, grep и так далее для отслеживания процессов. Там же запускай rsync. И вот скрипт на питоне просто запускает этот скрипт и снаружи подаёт в него пути что копировать, откуда копировать и куда копировать и всё. А дальше скрипт на питоне ждёт завершения этого чудесного скрипта, который и делает всю эту работу по обходу особенностей rsync'а. Таким образом всегда можно скрипту на питоне подать вообще другой скрипт, который тоже просто принимает пути, но в котором может вообще rsync'а не быть. Там может быть программа на Go, которая тоже так же берёт и сравнивает файлы, нужно ли их обновлять и может даже по сети копировать, но которая не форкает там ничего в системе и работает предсказуемо.

Нужно всю ерунду закрыть в чёрной коробочке и общаться с этой чёрной коробочкой просто снаружи. Это инкапсуляция в модуле и общение с этим модулем только через его интерфейс.



Отредактировано py.user.next (Май 13, 2023 03:15:07)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version