запуск резервного копирования после обновления Dropbox

Я пытаюсь запустить скрипт резервного копирования, который, как мне известно, работает, потому что я его протестировал. Я также знаю, что cronjob запустится и скрипт выполнится успешно, если я возьму цикл while. Я хочу сохранить цикл while, потому что я хочу, чтобы резервное копирование происходило после обновления Dropbox. Я поместил команду echo в цикл while, а затем смотрю -n1 вывод команды cat в файле журнала и вижу, что каждые 10 секунд в файл заносится файл «Dropbox не работает!» но я знаю, что это потому, что, если я запускаю статус dropbox, он говорит: «В курсе». Вот сценарий:

#!/bin/bash

if [[ $(($(date +%A-%B-%d-%Y) != $(cat /home/user/Log/backup.log | tail -n1 | cut -d " " -f7))) \
 -eq 1 ]]
then
while [[ $(dropbox status) != "Up to date" ]]
do
    echo $(dropbox status) >> /home/user/Log/backup.log
    sleep 10s
done
shopt -s dotglob globstar

if [[ $(($(date +%d) % 2)) -eq 0 ]]
    then
    cp -r --preserve /home/user/*/backup/daily0/home >> /home/user/Log/backup.log 2>&1
    cp -r --preserve /etc/* /backup/daily0/etc >> /home/user/Log/backup.log 2>&1
    rm -rf /backup/daily0/home/Dropbox/.dropbox >> /home/user/Log/backup.log 2>&1
    rm -rf /backup/daily0/home/Dropbox/.dropbox.cache >> /home/user/Log/backup.log 2>&1
    echo "successful backup of /home/user and /etc: $(date +%A-%B-%d-%Y) $(date +%l:%M%P)" >>\
    /home/user/Log/backup.log
else 
    cp -r --preserve /home/user/* /backup/daily1/home >> /home/user/Log/backup.log 2>&1
    cp -r --preserve /etc/* /backup/daily1/etc >> /home/user/Log/backup.log 2>&1
    rm -rf /backup/daily1/home/Dropbox/.dropbox >> /home/user/Log/backup.log 2>&1
    rm -rf /backup/daily1/home/Dropbox/.dropbox.cache >> /home/user/Log/backup.log 2>&1
    echo "successful backup of /home/user and /etc: $(date +%A-%B-%d-%Y) $(date +%l:%M%P)" >>\
    /home/user/Log/backup.log
fi
exit 0
else
    exit 0
fi

Вот sudo crontab:

@reboot /usr/local/bin/dailyBackup

Я пробовал несколько вещей:

@reboot sleep 60 && /usr/local/bin/dailyBackup

@reboot /usr/bin/dropbox start && /usr/local/bin/dailyBackup

@reboot /usr/bin/dropbox start && sleep 60 && /usr/local/bin/dailyBackup

Я также пытался положить Команда запуска dropbox в самом сценарии и установка в качестве первой команды сценария sleep 60, но независимо от того, что я делаю, вывод статуса dropbox внутри сценария, запускаемого cron, - «Dropbox не выполняется!». Что я здесь не правильно делаю?

edit:

Я хочу прояснить, что скрипт отлично работает с циклом while на месте, когда вызывается после загрузки во время нормального запуска системы, например:

sudo dailyBackup
0
задан 26 September 2019 в 05:28

2 ответа

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

<час>

я вошел в азарт отправленный предыдущий ответ прежде даже выключить мои машины, чтобы видеть, что была некоторая проблема с чем-то все еще выполнение. Я не выяснил точно, какова та проблема была, я полагаю, что это происходило из-за моего сценария, не являющегося совместимым LSB и находящегося в/etc/init.d.

я на самом деле решил проблему теперь, и решение работало отлично в течение нескольких дней, я протестировал его многократно в тот период.

, Что я сделал: Я нашел это сообщение при работе над тем, чтобы заставлять этот тот же сценарий работать при начальной загрузке на моей установке Arch, которая находится на отдельном диске в этом рабочем столе: https://unix.stackexchange.com/questions/138281/arch-linux-run-script-a-minute-after-boot и затем я пересмотрел эту страницу, что я не заглянул некоторое время: https://wiki.archlinux.org/index.php/Systemd следующее решение работало над моей машиной Arch и, понимая, что Ubuntu также выполняет Systemd, я решил попробовать его на Ubuntu также... успех:)

Вот теперь рабочее решение:

#!/bin/bash

if [[ $(($(date +%A-%B-%d-%Y) != $(cat /home/user/Log/backup.log | tail -n1 | cut -d " " -f7))) \
     -eq 1 ]]
    then
    while [[ $(sudo -u user dropbox status) != "Up to date" ]]
    do
        sleep 10s
        [[ $(uptime | cut -d " " -f4) -ge 30 ]] && echo "Dropbox took to long on $(date)" >> \
        /home/user/Log/backup.log && exit 0
    done
    shopt -s dotglob globstar

    # Change to BACKUPNUM=$(($(date +%d) % 10)) when get separate drive to                  
    # backup to some day

    BACKNUM=$(($(date +%d) % 2))
    rsync -aAX --delete /home/user/ /backup/daily${BACKNUM}/user/ >> \
    /home/user/Log/backup.log 2>&1
    [[ $? -eq 0 ]] && rsync -aAX --delete /etc/ /backup/daily${BACKNUM}/etc/ >> \
    /home/user/Log/backup.log 2>&1
    [[ $? -eq 0 ]] && rm -rf /backup/daily${BACKNUM}/user/.dropbox >> \
    /home/user/Log/backup.log 2>&1
    [[ $? -eq 0 ]] && rm -rf /backup/daily${BACKNUM}/user/Dropbox/.dropbox >> \
    /home/user/Log/backup.log 2>&1
    [[ $? -eq 0 ]] && rm -rf /backup/daily${BACKNUM}/user/Dropbox/.dropbox.cache >> \
    /home/user/Log/backup.log 2>&1
    [[ $? -eq 0 ]] && \
    echo "successful backup of /home/user and /etc: $(date +%A-%B-%d-%Y) $(date +%l:%M%P)" >> \
    /home/user/Log/backup.log
    exit 0
else
    exit 0
fi

, Таким образом, я добавил следующие два файла/etc/systemd/system/dailyBackup.service:

[Unit]
Description=dailyBackup

[Service]
Type=simple
ExecStart=/usr/local/bin/dailyBackup

и/etc/systemd/system/dailyBackup.timer:

[Unit]
Desciption=Runs dailyBackup one minute after boot

[Timer]
#how long to wait before executing
OnBootSec=1min
Unit=dailyBackup.service

[Install]
WantedBy=multi-user.target

я затем работал:

sudo systemctl enable dailyBackup.timer

и завершение работы система. После включения назад, сценарий выполнился успешно и нет никакого завершения работы или проблем перезагрузки. Это решение, как ранее указано, работало в течение нескольких дней теперь. Как видно в сценарии, я использую rsync теперь, который был предложен беконом в их комментарии к моему последнему ответу. Я попробовал rsync несколько раз в прошлом и действительно полностью никогда не выяснял, почему существуют все еще различия, когда я выполняю разность-r, но я думаю, что понял, что они происходят из-за системы .files, которые изменились немного начиная с выполнения rsync и также потому что у меня, кажется, есть некоторые поврежденные символьные ссылки в ~/snap/gnome-system-monitor/current/.local/share/icons/hicolor на моем рабочем столе и даже нет поспешного каталога на моем ноутбуке Ubuntu. Это должно произойти из-за чего-то, что я ранее установил и удалил. Это для другого вопроса, хотя, как проблема, которые - удаляют флаг rsync, кажется, отменяет - исключают флаг, даже когда я добавляю - удаляют - исключенный флаг. Который является, почему мой сценарий все еще имеет операторы комнаты после rsync. Я надеюсь, что это полезно кому-то, я извлек уроки из этого и мне, который неоценим. Теперь я должен сделать некоторую фактическую школьную работу вместо того, чтобы играть с и узнать о Linux, который является одной из моих любимых вещей сделать:)

обновление:

, Таким образом, я выяснил, что шаблоны во флаге rsync - исключают = {}, должны быть относительные пути, относительно исходного каталога, синхронизировавшего от, и именно поэтому исключение игнорировалось полностью. Я вставлял полные пути. так комната-rf операторы больше не необходимы. Я также добавил некоторые условные выражения к циклу с условием продолжения теперь и уменьшил сон к одной секунде (я знаю, что это близко к опросу команды) так, чтобы, если Dropbox берет к долго для обновления, потому что я добавил некоторые огромные видеофайлы или что-то, сценарий вышел 0, если я завершу работу или перезагрузка, в то время как сценарий все еще выполняет тот цикл с условием продолжения. Таким образом, пока я не выясняю лучший способ остановить сценарий в случае завершения работы, или перезагрузка и лучший способ иметь сценарий ожидают, пока Dropbox не актуален, возможно, что-то в dailyBackup.timer, чтобы даже не выполнить его, пока Dropbox не актуален, вот текущая лучшая рабочая версия сценария:

#!/bin/bash

if [[ $((10#$(date +%d) != 10#$(cat /home/user/Log/backup.log | tail -n1 | cut -d " " -f7 | \
      cut -d "-" -f3))) -eq 1 ]]
    then
    while [[ $(sudo -u user dropbox status) != "Up to date" ]]
    do
        [[ $(runlevel | cut -d " " -f2) -eq 0 ]] && exit 0
        [[ $(runlevel | cut -d " " -f2) -eq 6 ]] && exit 0
        [[ $(uptime | cut -d " " -f4) -ge 30 ]] && echo "Dropbox took to long on $(date)" >> \
        /home/user/Log/backup.err && exit 0
        sleep 1s
    done
    shopt -s dotglob globstar

    # Change to BACKUPNUM=$(($(date +%d) % 10)) when get separate drive to backup to someday

    BACKNUM=$((10#$(date +%d) % 2))
    rsync -aAX --delete-excluded \
    --exclude={".dropbox","Dropbox/.dropbox",".dropbox-dist","Dropbox/.dropbox.cache"} \
    /home/user/ /backup/daily${BACKNUM}/user/ >> /home/user/Log/backup.err 2>&1
    [[ $? -eq 0 ]] && rsync -aAX --delete /etc/ /backup/daily${BACKNUM}/etc/ >> \
    /home/user/Log/backup.err 2>&1
    [[ $? -eq 0 ]] && \
    echo "successful backup of /home/user and /etc: $(date +%A-%B-%d-%Y) $(date +%l:%M%P)" >> \
    /home/user/Log/backup.log
    exit 0
else
    exit 0
fi

я не заявил это, однако для использования этого я создал резервный каталог / и затем/backup/daily0 и/backup/daily1 и "sudo chown me:myGroup" они оба и затем создал пользователя и и т.д. каталог и в daily0 и в daily1.

Также на моем ноутбуке я изменил dailyBackup.timer для запуска сценария 3 спустя минуты после начальной загрузки, так как у Wi-Fi занимает больше времени начаться, чем проводное соединение, и на моем рабочем столе я изменил его на 2 минуты только для помощи ему не, цикл как долго в случае длинного Dropbox обновляет время.

Также, когда дата совершила нападки 08, я нашел, что начиная с чисел в первом условном выражении, если интерпретируются как восьмеричные, я должен был предварительно ожидать 10# так, чтобы это использовало основу 10 чисел везде, которые предложили мне просто добавлять дополнительное сокращение-d для использования только фактического дня месяца вместо того, чтобы сравнить всю строку даты. Проблема об этом веб-сайте - то, что знаки фунта интерпретируются в блоке кода как запуск комментария, таким образом, он делает, это быть похожим на последнюю из тех строк являются просто комментарии, они не. Я также нашел, что лучше отправить ошибки в один файл и успешные журналы другому.

первая строка кода после хижины и строки, где переменный BACKNUM инстанцируют, является строками, о которых я говорю.

1
ответ дан 23 October 2019 в 10:27

Я выяснил, как решить проблему. Я считал это: https://www.linux.com/news/introduction-services-runlevels-and-rcd-scripts / и затем я скопировал свой сценарий в/etc/init.d и сделал символьную ссылку на него от/etc/rc5.d следующим образом:

sudo ln -s ../init.d/dailyBackup ./S01dailyBackup

Теперь, что было просто зарегистрировано к /home/user/Log/backup.log, поскольку я наблюдал его после того, как начальная загрузка была:

Dropbox isn't running!
Checking for changes...
successful backup of /home/user and /etc: Sunday-September-29-2019 at 10:06am

Это чувствует себя подобно более твердому раствору, чем выполнение cronjob при начальной загрузке так или иначе. Вот окончательная версия сценария:

#!/bin/bash

if [[ $(($(date +%A-%B-%d-%Y) != $(cat /home/user/Log/backup.log | tail -n1 | cut -d " " -f7))) \
     -eq 1 ]]
    then
    while [[ $(sudo -u user dropbox status) != "Up to date" ]]
    do
        echo $(sudo -u user dropbox status) >> /home/user/Log/backup.log
        sleep 10s
    done
    shopt -s dotglob globstar

    if [[ $(($(date +%d) % 2)) -eq 0 ]]
        then
        if [[ -e /backup/daily0/user ]]
            then
            rm -rf /backup/daily0/user/ >> /home/user/Log/backup.log 2>&1
        fi
        if [[ -e /backup/daily0/etc ]]
            then
            rm -rf /backup/daily0/etc/ >> /home/user/Log/backup.log 2>&1
        fi
        cp -r --preserve /home/user/ /backup/daily0/ >> /home/user/Log/backup.log 2>&1
        cp -r --preserve /etc/ /backup/daily0/ >> /home/user/Log/backup.log 2>&1
        rm -rf /backup/daily0/user/Dropbox/.dropbox >> /home/user/Log/backup.log 2>&1
        rm -rf /backup/daily0/user/Dropbox/.dropbox.cache >> /home/user/Log/backup.log 2>&1
        echo "successful backup of /home/user and /etc: $(date +%A-%B-%d-%Y) $(date +%l:%M%P)" >>\
        /home/user/Log/backup.log
    else 
        if [[ -e /backup/daily1/user ]]
            then
            rm -rf /backup/daily1/user/ >> /home/user/Log/backup.log 2>&1
        fi
        if [[ -e /backup/daily1/etc ]]
            then
            rm -rf /backup/daily1/etc/ >> /home/user/Log/backup.log 2>&1
        fi
        cp -r --preserve /home/user/ /backup/daily1/ >> /home/user/Log/backup.log 2>&1
        cp -r --preserve /etc/ /backup/daily1/ >> /home/user/Log/backup.log 2>&1
        rm -rf /backup/daily1/user/Dropbox/.dropbox >> /home/user/Log/backup.log 2>&1
        rm -rf /backup/daily1/user/Dropbox/.dropbox.cache >> /home/user/Log/backup.log 2>&1
        echo "successful backup of /home/user and /etc: $(date +%A-%B-%d-%Y) $(date +%l:%M%P)" >>\
        /home/user/Log/backup.log
    fi
    exit 0
else
    exit 0
fi

я пытался использовать и 7Z для сжатия каталогов в архив, который действительно сохранял приблизительно 10 ГБ за резервное копирование и так как я сохраняю ценность 2 дней в любой момент времени, которая составляет 20 ГБ сохраненного дискового пространства. Проблема - то, что сценарий занимает час для выполнения так, я затем попробовал его tar-cjf, который сохранил приблизительно 8 ГБ за резервное копирование, но тем не менее потребовалось почти час для сценария для выполнения его задачи. Таким образом, я жертвую 20 ГБ дискового пространства для пользы эффективности, в конце концов, Большой-O обычно более важно в эти дни если, имея дело с очень маленькой мощностью во встроенных системах. Я любил решать это, и я надеюсь, что это помогает кому-то пытающемуся сделать подобную вещь когда-то:) Для меня хорошо иметь прошлые 2 дня всех тех файлов и каталогов, сохраненных в случае, если я хочу получить более старую версию, прежде чем я внес некоторое изменение в школьный проект или файл конфигурации в / и т.д., Возможно, я добавлю некоторые другие каталоги к резервным копиям в будущем, как узнают больше. В моей школе все мы у студентов информатики есть учетная запись на базирующемся школьном сервере Debian, который является действительно классным. У всех нас есть доступ к ценности 21 дня backukps наших корневых каталогов в каталогах,/backup/daily.0/userName через/backup/daily.20/userName, это - то, где я получил идею после сохранения моего .bash_history от 21 день назад и слияние его с моей историей от один день назад. Я записал сценарий, который сохраняет мой .bash_history и мой .tmux_history объединенными cronjob каждые 5 минут. при отладке сценария я уничтожил и содержание файла пару раз и был рад смочь сохранить свою историю, поскольку я сохраняю неограниченную длину файла истории, которую у меня есть сценарий для усечения путем удаления дублирующихся записей один раз в год на cronjob.

1
ответ дан 23 October 2019 в 10:27

Другие вопросы по тегам:

Похожие вопросы: