- Вопрос или проблема
- Мониторинг запущенного процесса в GNU/Linux
- Мониторинг передачи rsync на обеих концах
- Отправляющая сторона против стороны получателя.
- Сервер против клиента.
- И для других инструментов…
- Ответ или решение
- Использование strace для отслеживания файлов
- Использование lsof для отслеживания открытых файлов
- Использование proc файловой системы
- Логирование с помощью вывода в файл
- Использование screen для мониторинга
Вопрос или проблема
У меня есть задание 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:
-
Получите PID работающего процесса
rsync
:ps -C rsync -o pid,cmd
-
Определите, с какими файлами работает
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
и понимать, какие файлы обрабатываются в реальном времени. Каждый из инструментов предлагает свои преимущества в зависимости от ваших предпочтений и окружения.