Я работаю над сценарием резервного копирования bash, который выполняет кучу длинных rsync
рабочие места. Некоторые из них занимают до 3-4 часов каждый.
После этих больших передач я хочу очистить кеш диска после синхронизации файлов перед запуском контрольных сумм на целевом диске, чтобы убедиться, что все на целевом диске было скопировано правильно. У меня есть эта строка ниже, которая предположительно делает это, требуя sudo
:
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
Чтобы выполнить весь сценарий bash без прерывания, я запрашиваю пароль пользователя в начале для sudo
, но я замечаю sudo
по понятным причинам сохраняет сеанс паролей всего около 15 минут. Через несколько часов скрипт перестает ждать, пока пользователь войдет в sudo
пароль еще раз.
Как лучше всего запустить этот сценарий, чтобы сохранить sudo
разрешения на время, когда они необходимы, но без запроса пароля каждый раз, чтобы сценарий работал без перебоев в течение нескольких часов, сохраняя возможность команды очистки дискового кеша?
#!/bin/bash
# backup all drives using rsync and also verify the integrity of the backup
# BACKUP
# first, drop the disks internal volatile caches to start with clean file system state (https://unix.stackexchange.com/questions/30970/)
printf "\nNeed sudo priviliges in order to flush disk caches in this script.\n"
# invoke sudo to ask for permission needed to clear the disk cache in next command
sudo printf "\nClearing disk cache... "
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
printf "DONE.\n\n\n"
# now run the backup lines
# First disk
printf "rsync 'First' disk...\n"
# need to put [] around $ to escape it for folders like $RECYCLE.BIN (https://stackoverflow.com/questions/19305010)
rsync -vah --progress --stats --exclude={"Adobe","[$]RECYCLE.BIN","System Volume Information","pagefile.sys","temp"} /media/n/First/ ./First/
printf "\n\n"
# Scratch disk
printf "rsync 'Scratch' disk...\n"
rsync -vah --progress --stats --exclude={"[$]RECYCLE.BIN","System Volume Information","pagefile.sys","temp"} /media/n/Scratch/ ./Scratch/
printf "\n\n"
# ...
# CHECKSUM
# re-read/compare
# drop the disks internal volatile caches
printf "Now testing backup checksums for integrity.\n\n"
# rsync --itemize-changes, legend here: (https://stackoverflow.com/questions/4493525)
# First disk
printf "Clearing disk cache... "
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
printf "DONE.\n"
printf "Checking 'First' disk backup...\n"
# need to put [] around $ to escape it for folders like $RECYCLE.BIN (https://stackoverflow.com/questions/19305010)
rsync -vah --progress --checksum --itemize-changes --stats --exclude={"Adobe","[$]RECYCLE.BIN","System Volume Information","pagefile.sys","temp"} /media/n/First/ ./First/
printf "\n\n"
# ...
print "Finished.\n\n"
# revoke sudo
sudo -k
exit
Запустите свой скрипт с помощью sudo.
sudo yourscript.sh
Вам будет предложено только один раз, и сценарий будет запущен с правами root.
используйте (как root) visudo (или отредактируйте / etc / sudoers напрямую) и добавьте:
# below "root ALL=..."
jonny ALL=NOPASSWD: your_script
Примечание: сценарий должен находиться в одном из «безопасных_путь» в / etc / sudoers