Уведомления

Группа в Telegram: @pythonsu

#1 Май 11, 2023 22:11:35

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

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

Всем привет.
Я, видимо, чего-то не понимаю или упускаю. Вот официальная дока на subprocess.run - https://docs.python.org/3/library/subprocess.html

Цитата из описания

Run the command described by args. Wait for command to complete, then return a CompletedProcess instance.

Я не эксперт в английском, но написано, что ЖДЕТ выполнения.

У меня есть скрипт, который дергает системный rsync. Упростил его немного.

 #!/usr/bin/env python3
import subprocess
def rsync():
    subprocess.run(['rsync', '-ahv', '/path1/', '/path2/'])
print('Start')
rsync()
print('Finish')
Если в /path1 немного файлов, то все ок. Я вижу в выхлопе в терминале Start, потом все, что пишет rsync, потом Finish. Однако если в /path1 файлов хотя бы секунд на 10 копирования, то я вижу, что Finish в выхлопе в середине работы rsync. После Finish еще много файлов копируется, причем это именно копирование rsync, а не сброс кеша из памяти.

В чем проблема? Почему subprocess.run на самом деле не ждет завершения rsync?

Офлайн

#2 Май 11, 2023 22:54:53

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

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

Так функция выполнила поставленную задачу и код выпоняется дальше
Вы же не указали нигде дополнительного поведения
Если нужен якорь то гляньте эти примеры

 import subprocess
# start the subprocess
process = subprocess.Popen(['ls', '-l'])
# wait for the subprocess to complete
process.wait()
# continue with the rest of your program
print("Subprocess completed.")

или
 import subprocess
# start the subprocess
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# wait for the subprocess to complete and collect its output
output, error = process.communicate()
# print the output and any errors
print(output)
print(error)



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

Офлайн

#3 Май 11, 2023 23:31:28

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

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

Ни тот, ни другой вариант не работают, точнее, они работают ровно так же, как subprocess.run.

 #!/usr/bin/env python3
import subprocess
def rsync():
    proc = subprocess.Popen(['rsync', '-ahv', '/path1/', '/path2/'])
    proc.wait()
print('Start')
rsync()
print('Finish')

Start
...
syncthing/
syncthing/cert.pem
syncthing/config.xml
syncthing/csrftokens.txt
syncthing/https-cert.pem
syncthing/https-key.pem
syncthing/key.pem
Finish
syncthing/index-v0.14.0.db/
syncthing/index-v0.14.0.db/000040.ldb
syncthing/index-v0.14.0.db/000041.log
syncthing/index-v0.14.0.db/000043.ldb
syncthing/index-v0.14.0.db/CURRENT
syncthing/index-v0.14.0.db/CURRENT.bak
syncthing/index-v0.14.0.db/LOCK
syncthing/index-v0.14.0.db/LOG
syncthing/index-v0.14.0.db/MANIFEST-000042
...

Отредактировано Ematten (Май 11, 2023 23:33:49)

Офлайн

#4 Май 12, 2023 00:01:37

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

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

Ematten
Я, видимо, чего-то не понимаю или упускаю.
https://serverfault.com/questions/547165/why-does-rsync-spawn-multiple-processes-for-me

Это особенность rsync какая-то. Так что можешь просто использовать другую программу для копирования файлов и всё будет ровно.



Офлайн

#5 Май 12, 2023 08:21:13

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

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

Вот оно что. Я и не подумал со стороны rsync взгляднуть на проблему.

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

Других вариантов для меня, увы, нет.

Офлайн

#6 Май 12, 2023 08:31:14

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

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

Возможно нужно попробовать любу
https://github.com/gchamon/sysrsync

С другой стороны тот же пинг отрабатывает корректно

 import subprocess
def rsync():
    proc = subprocess.Popen(["ping", "-c", "4", "8.8.8.8"])
    proc.wait()
print("Start")
rsync()
print("Finish")


Start
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=118 time=18.015 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=18.106 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=18.665 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=118 time=16.818 ms

— 8.8.8.8 ping statistics —
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 16.818/17.901/18.665/0.673 ms
Finish

попробуй с ключами поиграться - например добавь
–progress



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

Офлайн

#7 Май 12, 2023 09:27:03

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

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

Ematten
Других вариантов для меня, увы, нет.
Ну, если бы rsync не сущестовала, то ты бы вообще не смог скопировать это?



Офлайн

#8 Май 12, 2023 10:29:43

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

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

py.user.next, скрипт делает бэкап 12 Тб информации в мелких файлах на локальные диски и по сети через ssh. Благодаря тому, что rsync умеет отслеживать изменения перед копированием, это существенно ускоряет процесс и снижает расход трафика. Так что если бы rsync не было (вообще, вопрос странный), надо было бы его придумать.

ZerG, спасибо посмотрю sysrsync. Ключи rsync никак не влияют на проблему. Выше правильно дали ссылку. В rsync захардкожен многопоток, так что как только один поток, который subprocess считает основным, завершается, скрипт продолжает выполнять следующие директивы.

Офлайн

#9 Май 12, 2023 11:40:56

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

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

немного странно - может вы выполняете скрипт внутри какого-то потока? ССШ или там Tmux?
Я только что запустил по вашему же примеру синкопой локально у себя на машине и все отрабатывает так же как и с пингом



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

Офлайн

#10 Май 12, 2023 14:34:56

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

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

немного странно - может вы выполняете скрипт внутри какого-то потока? ССШ или там Tmux?

Запускаю локально в терминале без мультиплексеров.

Я только что запустил по вашему же примеру синкопой локально у себя на машине и все отрабатывает так же как и с пингом

Условия проверки, которые я выше описывал, соблюдены? Копирование больше 10 секунд?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version