Контролировать/Наблюдать за работающим процессом rsync

Вопрос или проблема

У меня есть задание rsync, которое было добавлено в crontab, и когда оно выполняется, я могу только проверить, что существует PID rsync, и подтвердить с помощью htop, что он использует n количество CPU и RAM.

Я хочу мониторить, какие файлы на самом деле синхронизируются с помощью rsync в реальном времени… когда я захочу. Для информации, я не передавал никаких опций для вывода в команду и не добавлял какое-либо логирование. Я просто хочу проверить, что синхронизируется rsync по требованию.

Есть идеи, как я могу этого достичь?

Вы можете сделать так (в POSIX оболочках, включая bash):

strace -e open,openat $(ps -o lwp= -LC rsync | sed 's/^/-p/')

Или в zsh:

strace -e open,openat -p${^$(ps -o lwp= -LC rsync)}

Или в fish

strace -e open,openat -p(ps -o lwp= -LC rsync)

Или в rc/es:

strace -e open,openat -p`{ps -o lwp= -LC rsync}

Чтобы увидеть, что происходит, или

lsof -ad3-999 -c rsync

чтобы увидеть, какие файлы в данный момент открыты.

Самым простым решением было бы перенаправление вывода rsync в файл журнала.

rsync -avz /something /somwhere >> ~/rsynclog

Другой способ, который вы можете использовать, если вы знаете примерно, какой каталог вы будете синхронизировать (например, используем каталог ‘movies’), вы можете использовать комбинацию lsof и grep:

lsof | grep rsync | grep movies

lsof покажет ваши открытые файлы, передаст вывод в grep, чтобы найти любые, открытые с помощью rsync, и передаст тот вывод в grep, чтобы найти каталог/файл, который открыт.

Мониторинг запущенного процесса в GNU/Linux

Мониторинг передачи rsync на обеих концах

Запустив ядро Linux, вы можете запросить псевдо-файловую систему /proc. Нет нужды прибегать к strace или lsof (это может быть полезным на небольшой конфигурации, где такие инструменты даже не установлены).

ps -C rsync fw
  PID TTY      STAT   TIME COMMAND
 8645 ?        Ss     0:00 /usr/bin/rsync --daemon --no-detach
13763 ?        S      0:01  \_ /usr/bin/rsync --daemon --no-detach
13764 ?        S      1:30      \_ /usr/bin/rsync --daemon --no-detach

ps -C rsync fwo pid,lstart,stat,cmd
  PID                  STARTED STAT CMD
 8645 Sat Jul 10 14:34:12 2021 Ss   /usr/bin/rsync --daemon --no-detach
13763 Sat Jul 10 15:51:23 2021 S     \_ /usr/bin/rsync --daemon --no-detach
13764 Sat Jul 10 15:51:23 2021 S         \_ /usr/bin/rsync --daemon --no-detach

Первый процесс – это демон, просмотр времени запуска показывает два процесса, запущенные удаленным rsync.

Итак, смотрим на последний:

mapfile -t allrsyncpid < <(ps -C rsync fho pid)
rsyncpid=$((${allrsyncpid[@]: -1}))

Затем, с этой переменной $rsyncpid:

ls -l /proc/$rsyncpid/fd
total 0
lr-x------ 1 root root 64 jui 10 15:51 0 -> /dev/null
lrwx------ 1 root root 64 jui 10 15:51 1 -> socket:[106279330]
lrwx------ 1 root root 64 jui 10 15:51 2 -> socket:[106279330]
lrwx------ 1 root root 64 jui 10 15:51 3 -> socket:[106279331]
lrwx------ 1 root root 64 jui 10 15:51 4 -> /path/to/some/file.IxOWxh
lrwx------ 1 root root 64 jui 10 15:51 5 -> socket:[106323027]
lrwx------ 1 root root 64 jui 10 15:51 6 -> socket:[106320690]

Затем

ls -l $(readlink /proc/$rsyncpid/fd/4)
-rw------- 1 root root 41024 Jun 10 15:59 /path/to/other/file.ZIjEDk

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

while [ -d /proc/$rsyncpid ] ;do
    ls -l $(readlink /proc/$rsyncpid/fd/4)
    read -t .5 _ && break
done
-rw------- 1 root root 0 Jul 10 16:16 /path/to/some/file.nMM3Lz
-rw------- 1 root root 0 Jul 10 16:16 /path/to/other/file.H2b61i
-rw------- 1 root root 0 Jul 10 16:16 /path/to/some/bigfile.B0Xgg7
-rw------- 1 root root 2097152 Jul 10 16:16 /path/to/some/bigfile.B0Xgg7
-rw------- 1 root root 42359296 Jul 10 16:16 /path/to/some/bigfile.B0Xgg7

До тех пор, пока вы не нажмете return или не завершите процесс rsync.

Конечно, так как вы наблюдаете за входами /proc, которые создаются и быстро удаляются другим процессом, существует вероятность, что ls будет выполнен слишком поздно после readlink. Поэтому такие сообщения не вредны:

ls: cannot access '/path/to/some/file.fKSZss': No such file or directory

Отправляющая сторона против стороны получателя.

Команда ls в предыдущем примере позволит вам видеть, как файл увеличивается, так как файл не существует до этого.

На отправляющей стороне. Поскольку файлы читаются, есть другое замечательное поддиректория /proc: /proc/PID/fdinfo. Записи в этом каталоге содержат информацию о текущем указателе:

ps -C rsync w
  PID TTY      STAT   TIME COMMAND
3762 pts/13   D+     3:18 rsync -ax /path/to/source/. rsync://rsyncserv/target

ls -l /proc/13762/fd
total 0
lrwx------ 1 root root 64 jui 10 16:27 0 -> /dev/pts/13
lrwx------ 1 root root 64 jui 10 16:27 1 -> /dev/pts/13
lrwx------ 1 root root 64 jui 10 16:27 2 -> /dev/pts/13
lrwx------ 1 root root 64 jui 10 16:27 3 -> socket:[106321578]
lr-x------ 1 root root 64 jui 10 16:27 4 -> /path/to/some/file

Затем

cat /proc/13762/fdinfo/4
pos:        2883584
flags:      0100000
mnt_id:     131

Где pos – это текущая позиция в файле, flag представляет собой, как этот файл доступен (0100000 означает LARGEFILE, посмотрите asm-generic/fcntl.h в вашем дереве исходников 😉 и mnt_id указывает, на какой файловой системе находится файл.

Таким образом:

rsyncpid=$(($(ps -C rsync ho pid)))
while [ -d /proc/$rsyncpid ] ;do
    read -r _ pos </proc/$rsyncpid/fdinfo/4
    crtfile=$(readlink /proc/$rsyncpid/fd/4)
    filesize=$(stat -c %s "$crtfile")
    printf "Crtfile: %s (%d), crtpos: (%d)\n" "$crtfile" "$filesize" "$pos"
    read -t .5 _ && break
done
Crtfile: /path/to/some/bigfile.iso (17985276), crtpos: (2097152)
Crtfile: /path/to/some/bigfile.iso (17985276), crtpos: (6553600)
Crtfile: /path/to/some/bigfile.iso (17985276), crtpos: (11272192)
Crtfile: /path/to/some/bigfile.iso (17985276), crtpos: (15990784)

То же самое: до тех пор, пока вы не нажмёте return или конец процесса rsync.

Сервер против клиента.

В этом примере команда rsync была инициирована для внешней системы, чтобы отправить/записать данные на сервер.

В случае если команда rsync используется для чтения/получения данных с сервера, метод остаётся таким же, но на другой стороне:

  • Для определения PID rsync

    • серверная сторона:

      mapfile -t allrsyncpid < <(ps -C rsync fho pid)
      rsyncpid=$((${allrsyncpid[@]: -1}))
      
    • сторона клиента:

      rsyncpid=$(($(ps -C rsync ho pid)))
      
  • Для отслеживания прогресса в файле

    • отправляющая сторона:

       while [ -d /proc/$rsyncpid ] ;do
           read -r _ pos </proc/$rsyncpid/fdinfo/4
           crtfile=$(readlink /proc/$rsyncpid/fd/4)
           filesize=$(stat -c %s "$crtfile")
           printf "Crtfile: %s (%d), crtpos: (%d)\n" "$crtfile" "$filesize" "$pos"
           read -t .5 _ && break
       done
      
    • сторона получателя:

       while [ -d /proc/$rsyncpid ] ;do
           ls -l $(readlink /proc/$rsyncpid/fd/4)
           read -t .5 _ && break
       done
      

И для других инструментов…

Это работает для любого инструмента, который обращается к файлам. Вы можете следить за tar, sha1sum, gzip, cat, dd и т.д.

Отсюда вы могли бы добавить индикаторы прогресса… Посмотрите, как я добавил прогрессию к утилите grep в grep – как вывести индикатор прогресса или статус

Вот два способа

С использованием screen:
Подключите сеанс screen к вашей задаче cron:

screen rsync –progress src dst

это позволит вам повторно подключиться к задаче rsync в любое время, когда вы захотите проверить, какие файлы она сейчас обрабатывает (просто убедитесь, что вы тот же пользователь, который запустил задачу rsync)
с

screen -x

С логирования
добавьте логирование в вашу задачу rsync:

rsync --log-file=/tmp/rsync-status.txt src dst

затем следите за логом в реальном времени с помощью:

 tail -f /tmp/rsync-status.txt

Как предложил Кирай Иштван, я запускаю

rsync -ravz /Users/jkirby/Music/iTunes/* .

что дает вывод в форме

Jeffs-MBP-2:2016-08-15 jkirby$ rsync -ravz /Users/jkirby/Music/iTunes/* .
building file list ... done
Temp File 1.tmp
Temp File.tmp

Из этого вывода я могу увидеть, какой каталог копируется.

В случае, когда rsync копирует много больших файлов медленно, я мониторю этот каталог, используя watch таким образом. Таким образом я могу видеть временные файлы, которые создает rsync, и могу видеть, как размер файла, который в данный момент копируется, увеличивается.

watch -n1 "~/Music/iTunes"

.

Ответ или решение

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

Использование strace для отслеживания файлов

Вы можете использовать strace для мониторинга открытых файлов, используемых rsync, в реальном времени. Вот как это сделать в различных оболочках:

  • Для POSIX оболочек, таких как bash:

    strace -e open,openat $(ps -o lwp= -LC rsync | sed 's/^/-p/')
  • Для zsh:

    strace -e open,openat -p${^$(ps -o lwp= -LC rsync)}
  • Для fish:

    strace -e open,openat -p(ps -o lwp= -LC rsync)
  • Для rc или es:

    strace -e open,openat -p`{ps -o lwp= -LC rsync}

Использование lsof для отслеживания открытых файлов

Вы также можете использовать lsof для получения списка файлов, открытых rsync:

lsof -ad3-999 -c rsync

Использование proc файловой системы

Для более глубокого мониторинга вы можете использовать псевдо-файловую систему /proc в Linux:

  1. Получите PID работающего процесса rsync:

    ps -C rsync -o pid,cmd
  2. Определите, с какими файлами работает rsync через /proc/${pid}/fd:

    ls -l /proc/$rsyncpid/fd

Логирование с помощью вывода в файл

Наиболее простым решением будет добавить логирование в вашу команду rsync:

rsync -avz /source /destination >> ~/rsynclog

После этого вы можете следить за логом в реальном времени:

tail -f ~/rsynclog

Использование screen для мониторинга

Если вы хотите сохранить возможность подключиться к сессии rsync через screen, запустите команду в screen:

screen rsync --progress /source /destination

Подключайтесь к сессии с помощью:

screen -x

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

Оцените материал
Добавить комментарий

Капча загружается...