Простите, если есть действительно простой ответ на этот вопрос. Я относительно новичок в Linux.
Я пытаюсь создать плекс-медиа-сервер на Raspberry Pi для моего тестя, чтобы просматривать все его фотографии на своем телевизоре.
Основная концепция заключается в том, что у меня есть rpi с внешним жестким диском и устройство чтения карт USB SD. Когда SD-карта подключена, она автоматически копирует файлы на жесткий диск. Затем я указываю плекс на жесткий диск, чтобы забрать все фотографии.
Я уже построил простой сервер NAS / plex дома на rpi, так что запустил его без проблем. Однако у меня возникли проблемы с автоматическим копированием файлов с SD-карты.
Я никогда раньше не создавал сценариев, поэтому я использовал проект, который я нашел, в качестве справочника, называемого маленьким бэкапом, и попытался изменить его в соответствии со своими потребностями. Оригинал здесь, если вам нужно сослаться на него:
https://github.com/dmpop/little-backup-box/
Оригинальный сценарий определяет, когда устройства подключены, а затем выключает rpi. Поскольку я хочу запустить мультимедийный сервер PLEX на RPI, мне нужно, чтобы он оставался включенным. Полный скрипт изменен мной ниже.
#!/bin/bash
# IMPORTANT:
# Run the install-little-backup-box.sh script first
# to install the required packages and configure the system.
# Specify devices and their mount points
STORAGE_DEV="sda1"
STORAGE_MOUNT_POINT="/media/storage"
CARD_DEV="sdb1"
CARD_MOUNT_POINT="/media/card"
# When the USB storage device is detected, mount it
mount /dev/$STORAGE_DEV $STORAGE_MOUNT_POINT
# Wait for a card reader or a camera
CARD_READER=$(ls /dev/* | grep $CARD_DEV | cut -d"/" -f3)
until [ ! -z $CARD_READER ]
do
sleep 1
CARD_READER=$(ls /dev/sd* | grep $CARD_DEV | cut -d"/" -f3)
done
# If the card reader is detected, mount it and obtain its UUID
if [ ! -z $CARD_READER ]; then
mount /dev/$CARD_DEV $CARD_MOUNT_POINT
# # Set the ACT LED to blink at 500ms to indicate that the card has been mounted
sudo sh -c "echo 500 > /sys/class/leds/led0/delay_on"
# Create the CARD_ID file containing a random 8-digit identifier if doesn't exist
if [ ! -f $CARD_MOUNT_POINT/CARD_ID ]; then
< /dev/urandom tr -cd 0-9 | head -c 8 > $CARD_MOUNT_POINT/CARD_ID
fi
# Read the 8-digit identifier number from the CARD_ID file on the card
# and use it as a directory name in the backup path
read -r ID < $CARD_MOUNT_POINT/CARD_ID
BACKUP_PATH=$STORAGE_MOUNT_POINT/"$ID"
# Perform backup using rsync
rsync -avh --timeout=10 $CARD_MOUNT_POINT/ $BACKUP_PATH
fi
exec $0 && exit
Это прекрасно работает по большей части. Я могу вставить одну SD-карту, и она скопирует все файлы.
Однако проблема, с которой я сталкиваюсь, заключается в том, что мне нужно, чтобы это было достаточно надежно, так как мой тесть стар и может вытащить SD-карты, прежде чем они закончат копировать и т. Д. Мне также нужно, чтобы потом скопировать другой SD после удаления оригинала.
Поэтому я попытался изменить сценарий, чтобы перезапустить себя после завершения. Кажется, что это работает, так как я вижу, что скрипт backup.sh работает, когда я ввожу команду top.
Однако, если копирование намеренно прерывается извлечением SD-карты, то при подключении новой карты памяти новые файлы не копируются. Я полагаю, что проблема может быть связана с тем, что процесс rsync не был надлежащим образом завершен / завершен.
Поэтому я добавил --timeout = 10, чтобы попытаться аккуратно завершить процесс rsync, если IO не обнаружен, но, похоже, это не работает, так как я вижу, что rsync продолжает работать как процесс после извлечения SD. карта.
Я не совсем уверен, где я ошибаюсь, и я только предполагаю, что это проблема с rsync. Так что любая помощь высоко ценится.
Дополнительная информация: модель rpi 3 b + бегущая растяжка.