Освободите место, занятое журналом, и сохраните аудиозапись

LinuxBeginner
Практиковаться сейчас

Введение

У Community Radio есть фрагмент для вечерней программы, но небольшой медиадиск заполнен. Имя большого журнала доступа уже удалили. Станция по-прежнему отдаёт архив, однако место не вернулось. Удаление ценных записей решало бы не ту проблему.

Вы найдёте файл, который всё ещё держит Nginx, примените документированный сигнал повторного открытия и сохраните и воспроизведёте весь новый фрагмент при работающих исходных сервисах. Нужны только основы терминала. C, форматирование устройств и настройка хранилища не требуются. Для репетиции используется синтезированная английская речь.

Команды выполняйте в Workstation, слушайте в Radio Player. У каждой работы собственный подготовленный инцидент. Работайте только в /home/labex/project/radio и отправляйте сигнал только определённому master станции; посторонние процессы принадлежат учебной платформе.

Возвращаем место, не останавливая станцию

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

Послушайте то, что нужно сохранить

Откройте Radio Player. Воспроизведите Archive recording, затем Incoming clip. Архив уже на медиадиске, входящий фрагмент ждёт за его пределами. В третьем проигрывателе ещё нет полной сохранённой записи. Это синтетические репетиционные голоса, не живой микрофон и не реальное интервью.

В Workstation команда pwd показывает текущее место, ls — записи каталога. Терминал начинает в подготовленном каталоге станции; при необходимости вернитесь через cd:

cd /home/labex/project/radio
pwd
/home/labex/project/radio
ls

media/ — изолированный диск. incoming/ находится в обычной файловой системе экземпляра. В services/ лежат конфигурации двух Nginx курса и файлы PID master. media.ext4 — подготовленный LabEx файл-основа фиксированного размера; не меняйте его. Создавать файловые системы и редактировать монтирование не нужно.

Подтвердите сбой и границу

findmnt -T показывает файловую систему пути. Целью должен быть именно каталог media, источником — устройство /dev/loop..., типом — ext4. У корневой системы другой источник. Устройство loop представляет ограниченный образ курса как блочное устройство.

findmnt -T media -o TARGET,SOURCE,FSTYPE
findmnt -T incoming -o TARGET,SOURCE,FSTYPE

cp копирует файл. Следующая копия специально должна завершиться ошибкой No space left on device и может оставить неполный файл назначения. Не используйте sudo: для этих файлов он не нужен.

cp incoming/evening-recording.wav media/recordings/evening-recording.wav

Это реальная нехватка ёмкости в небольшой медиасистеме. Исходный архив цел. df -h показывает блочную ёмкость в удобных единицах. du -xsh суммирует выделенные блоки файлов, доступных по именам под каталогом: -x ограничивает файловую систему, -s выводит итог, -h выбирает удобные единицы.

df -h media
du -xsh media

df показывает почти полное заполнение, а du находит мало данных. Они измеряют разное. Одного расхождения недостаточно для установления причины: важны также метаданные, резервные блоки, права, другие представления монтирования и прочие факторы.

Найдите настоящий процесс-держатель

Запись каталога связывает имя с inode, записью файла в файловой системе. Счётчик жёстких ссылок показывает количество имён этого inode. Процесс также может удерживать открытый файловый дескриптор — нумерованную ссылку на открытый файл. Удаление последнего имени обнуляет число ссылок, но блоки остаются до закрытия последней открытой ссылки.

lsof перечисляет открытые файлы. Для этого чтения используется sudo, поскольку master Nginx работает как root. -nP отключает разрешение имён узлов и портов, +L1 выбирает число ссылок меньше единицы, +f -- media — файловую систему, содержащую media, а -a пересекает условия. Сохраняйте фильтр: общий список может включать чужие удалённые файлы памяти и процессы платформы.

sudo lsof -nP -a +L1 +f -- /home/labex/project/radio/media

Ожидаются две строки Nginx для media/logs/access.log (deleted): master и worker. Прочтите PID, FD, DEVICE, SIZE/OFF, NLINK, NODE. Устройство и inode одинаковы, NLINK равен нулю. Размеры относятся к одному файлу, их нельзя складывать. FD вида 4w — дескриптор 4, открытый для записи. Устройство/inode идентифицируют файл этой системы даже без прежнего имени.

cat показывает текст. Прочтите настоящую конфигурацию и файл PID master. Пути pid и access_log должны соответствовать этой станции и удалённому медиажурналу:

cat services/studio/nginx.conf
cat services/studio/nginx.pid

MASTER — переменная оболочки. $(...) получает вывод команды, двойные кавычки передают значение одним аргументом. ps показывает процессы; -o выбирает столбцы, -p — этот PID, --ppid — также его детей. Подтвердите master из отфильтрованных строк lsof и путь конфигурации курса. Вторая строка — worker, родительский PID которого равен master.

MASTER=$(cat services/studio/nginx.pid)
ps -ww -o pid,ppid,user,args -p "$MASTER" --ppid "$MASTER"

Не действуйте, если отличаются монтирование, путь или личность master. Перепроверьте каталог и конфигурацию, не угадывайте PID и не сигнализируйте всем Nginx.

Попросите эту программу открыть журнал заново

Значение сигнала определяется программой. Nginx документирует USR1 как повторное открытие журналов: закрывает старые ссылки и открывает настроенное имя. TERM остановит программу, HUP имеет другую семантику перечитывания. Откройте руководство через man nginx, найдите SIGNALS, затем нажмите q. Тот же контракт есть в документации управления Nginx.

man nginx

kill умеет посылать именованный сигнал и не всегда означает завершение. Для master root нужен sudo. Пошлите только документированный сигнал только что подтверждённому master:

sudo kill -USR1 "$MASTER"

Снова посмотрите место, держателей и master. Открытие асинхронно; если держатель ещё ненадолго виден, через мгновение повторите эти наблюдения только для чтения.

df -h media
sudo lsof -nP -a +L1 +f -- /home/labex/project/radio/media
ps -ww -o pid,ppid,user,args -p "$MASTER" --ppid "$MASTER"

Место должно вернуться, строки удалённого медиажурнала исчезнуть, а PID master остаться прежним. Пустой отфильтрованный вывод lsof здесь ожидаем. Вы не остановили станцию и не освободили файл другой системы.

curl -fsS читает URL, завершается неуспешно при HTTP-ошибке и при необходимости выводит краткое сообщение. Обычный запрос станции должен работать. Затем tail -n 2 показывает последние две строки нового именованного журнала:

curl -fsS http://127.0.0.1:8080/on-air.txt
tail -n 2 media/logs/access.log

Ожидаются Community Radio: archive and live programme remain available. и новая запись GET /on-air.txt. Исходный процесс теперь пишет в новый журнал. Если место не вернулось, вновь исследуйте отфильтрованных держателей. Не удаляйте архив, не обрезайте дескрипторы, не останавливайте сервисы и не пересоздавайте монтирование. Если нового журнала нет, проверьте неизменённую конфигурацию и повторите документированное открытие для правильного master.

Сохраняем и используем полную запись

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

У источника и архива разные задачи. Сохраните оба. Повторный cp в то же место заменяет неполную копию, не изменяя источник.

cp incoming/evening-recording.wav media/recordings/evening-recording.wav

cmp сравнивает каждый байт и молчит при совпадении. Проверьте сразу после копирования:

cmp incoming/evening-recording.wav media/recordings/evening-recording.wav

sha256sum выводит отпечаток содержимого. Совпадающие хеши — ещё одно наглядное сравнение. Оценка также сверяет исходный архив и источник с подготовленными байтами.

sha256sum incoming/evening-recording.wav media/recordings/evening-recording.wav

Хеши двух строк должны совпасть. Нулевой или разреженный файл с правдоподобными именем и размером не является записью. Копия в другой файловой системе также не завершает медиадоставку.

findmnt -T media/recordings/evening-recording.wav -o TARGET,SOURCE,FSTYPE

Файл должен остаться на исходном изолированном монтировании ext4. Проверьте, что станция отдаёт реально сохранённый файл. -o указывает curl сохранить ответ вне медиадиска; сравните ответ с входящим фрагментом:

curl -fsS http://127.0.0.1:8080/recordings/evening-recording.wav -o /tmp/radio-delivered.wav
cmp incoming/evening-recording.wav /tmp/radio-delivered.wav

Вернитесь в Radio Player и обновите страницу. Включите Your saved recording, перемотайте ближе к концу и прослушайте заключительную фразу. Снова включите Archive recording. Скачайте файл через Download saved recording. Перейдите по Read the on-air message — сообщение станции должно быть доступно. В браузере нужно действие воспроизведения; сохранение байтов само его не запускает.

Если проигрыватель сообщает об ошибке формата или сети, вновь сравните источник и результат и проверьте URL. Попытка при полном диске может оставить обрезанный заголовок WAV или данные. После освобождения скопируйте неизменённый источник заново. При несовпадении не чините заголовки и не подгоняйте источник под повреждённый результат.

df -h media

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

Резюме

Вы вернули реальное дисковое пространство, различая имена, inode и открытые дескрипторы. Фильтрация по файловой системе связала удалённый журнал с нужным master Nginx; документированный сигнал USR1 освободил старые ссылки без замены процесса. Затем вы сохранили, сравнили, скачали и воспроизвели полный фрагмент, сохранив архив и сервисы.

Разница df/du — подсказка, а не диагноз. Поведение при повторном открытии зависит от программы: сначала читайте документацию. Здесь используются изолированный ext4 и синтезированная речь; форматирование, произвольное завершение процессов и полная политика ротации не рассматриваются.