Резервное копирование только при подключении к источнику питания и только в пределах временного окна

Я делаю ежедневные резервные копии, используя Deja Dup (стандартное приложение для резервного копирования Ubuntu) на моем ноутбуке под управлением Ubuntu 16.04. Создание резервной копии требует большой мощности, поэтому я хочу, чтобы резервная копия была автоматически запущена, если мой ноутбук подключен к электросети.

Кроме того, я не хочу, чтобы резервная копия автоматически запускалась с 8:00 до 9:45 (круглосуточная система) по местному времени (что является CET / CEST).

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

Резервное копирование может быть начато с помощью команды

deja-dup --backup 

, однако, я бы хотел, чтобы это было сделано с минимальным приоритетом, поэтому другие приложения не замедляются им, так что это будет:

 nice -n 19 deja-dup --backup 

Разумеется, приемлемы и другие способы создания резервной копии Deja Dup.

Я мог бы , конечно, проложить путь к решению, написав программу или скрипт, выполняя именно то, что я хочу. Тем не менее, это Linux и, вероятно, более простой и элегантный способ. Я предполагаю, что это, вероятно, все равно приведет к созданию скрипта, но, возможно, он будет намного короче и элегантнее, чем я придумал, когда я заставлю свой путь к решению. Но, пожалуйста, не играй в гольф с этим. : D

2 Solutions collect form web for “Резервное копирование только при подключении к источнику питания и только в пределах временного окна”

Самое изящное решение, о котором я могу думать, – это создать crontab, который можно настроить для запуска один раз в день вашего резервного скрипта также в определенный период времени.

Для проверки «подключено к власти» эта команда работает в моем случае:

 root@debian:/home/gv/Desktop/PythonTests# upower -i /org/freedesktop/UPower/devices/line_power_AC |grep online online: yes 

Вы можете включить это в свой скрипт следующим образом:

 onpower=$(upower -i /org/freedesktop/UPower/devices/line_power_AC |grep online |awk -F " " '{print $NF}') if [[ "$onpower" == "yes" ]];then deja-dup --backup fi 

Я теперь в основном взял гигантский кувалду, убил проблему, написав сценарий.

Сначала установите интерфейс командной строки PHP, например, через

 sudo apt install php-cli 

Я предполагаю, что установлен PHP 7. Если вы используете PHP 5, удалите : int из заголовка метода defineTimeUntilBackup ().

Затем сохраните следующий сценарий, который я написал (который поставляется с абсолютно никакой гарантией и не проверен, но у меня есть хорошее представление об этом, и он был слегка пьян при написании (прямо перед отправкой этого ответа)) в файл:

 #!/usr/bin/php <?php // CONFIGURATION /** * The command to execute to create a backup. */ define('backupCommand', 'nice -n 19 deja-dup --backup'); /** * The minumem period of time between 2 backups in seconds. */ define('minimumBackupSeparation', 20*3600); /** * The minimum time between 2 checks of whether a backup should be created in * seconds. Only positive integers are permitted. */ define('minimumWaitingTime', 300); /** * The path of the file in which the time stamp of the lasted back is stored. */ define('latestBackupTimestampFile', 'latestBackupTimestamp'); // END OF CONFIGURATION // Checking for root. if(posix_getuid() == 0) { die('Backup script runs as root. This is probably a bad idea. Aborting.'."\n"); } if(minimumWaitingTime !== (int) minimumWaitingTime) { die('Configuration error: Minumem waiting time must be an int!'."\n"); } if(minimumWaitingTime < 1) { die('Configuration error: Minimum waiting time too small!'."\n"); } while(true) { $timeUntilNextBackup = determineTimeUntilBackup(); if($timeUntilNextBackup === 0) { createBackup(); continue; } if($timeUntilNextBackup < 0) { $timeUntilNextBackup = minimumWaitingTime; } sleep($timeUntilNextBackup); } /** * Returns a non-negative int when waiting for a point in time, a negative int * otherwise. If a backups should have been created at a point in the past, * `0` is returned. */ function determineTimeUntilBackup() : int { $latestBackup = 0; if(file_exists(latestBackupTimestampFile)) { $fileContents = file_get_contents(latestBackupTimestampFile); if($fileContents != (int) $fileContents) { die('Error: The latest backup timestamp file unexpectedly doesn\'t ' .'contain a timestamp.'."\n"); } $latestBackup = (int) $fileContents; } $idealTimeUntilNextBackup = $latestBackup + minimumBackupSeparation - time(); if($idealTimeUntilNextBackup < 0) { $idealTimeUntilNextBackup = 0; } $batteryStateReading = exec("upower -i `upower -e | grep 'BAT'` | grep 'state'"); if(empty($batteryStateReading)) { echo 'Unable to read battery state!'."\n"; } else { if(strpos($batteryStateReading, 'discharging') !== false) { // Not connected to power. return -1; } } return $idealTimeUntilNextBackup; } /** * Creates a backup and notes it in the latest backup timestamp file. */ function createBackup() { file_put_contents(latestBackupTimestampFile, time()); exec(backupCommand); } 

Сделайте исполняемый файл, например, через:

 chmod 755 backup.php 

Затем добавьте файл в приложения для запуска. Как это делается, зависит от вашего дистрибутива. Для Ubuntu откройте «Startup Applications» из тире и создайте новую запись. В качестве команды просто введите путь к файлу, который вы создали выше.

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


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

Чтобы решить эту проблему, теперь она не считывает, заряжается ли аккумулятор, заряжается или разряжается, а вместо этого считывает состояние адаптера питания:

 #!/usr/bin/php <?php // CONFIGURATION /** * The command to execute to create a backup. */ define('backupCommand', 'nice -n 19 deja-dup --backup'); /** * The minumem period of time between 2 backups in seconds. */ define('minimumBackupSeparation', 20*3600); /** * The minimum time between 2 checks of whether a backup should be created in * seconds. Only positive integers are permitted. */ define('minimumWaitingTime', 300); /** * The path of the file in which the time stamp of the lasted back is stored. */ define('latestBackupTimestampFile', 'latestBackupTimestamp'); // END OF CONFIGURATION // Checking for root. if(posix_getuid() == 0) { die('Backup script runs as root. This is probably a bad idea. Aborting.'."\n"); } if(minimumWaitingTime !== (int) minimumWaitingTime) { die('Configuration error: Minumem waiting time must be an int!'."\n"); } if(minimumWaitingTime < 1) { die('Configuration error: Minimum waiting time too small!'."\n"); } // Don't back up within 5 minutes after bootup. sleep(5*60); while(true) { $timeUntilNextBackup = determineTimeUntilBackup(); echo $timeUntilNextBackup."\n"; if($timeUntilNextBackup === 0) { createBackup(); continue; } if($timeUntilNextBackup < 0) { $timeUntilNextBackup = minimumWaitingTime; } sleep($timeUntilNextBackup); } /** * Returns a non-negative int when waiting for a point in time, a negative int * otherwise. If a backups should have been created at a point in the past, * `0` is returned. */ function determineTimeUntilBackup() : int { $latestBackup = 0; if(file_exists(latestBackupTimestampFile)) { $fileContents = file_get_contents(latestBackupTimestampFile); if($fileContents != (int) $fileContents) { die('Error: The latest backup timestamp file unexpectedly doesn\'t ' .'contain a timestamp.'."\n"); } $latestBackup = (int) $fileContents; } $idealTimeUntilNextBackup = $latestBackup + minimumBackupSeparation - time(); if($idealTimeUntilNextBackup < 0) { $idealTimeUntilNextBackup = 0; } $batteryStateReading = exec("acpi -a"); if(strpos($batteryStateReading, 'on-line') === false) { // Not connected to power. return -1; } return $idealTimeUntilNextBackup; } /** * Creates a backup and notes it in the latest backup timestamp file. */ function createBackup() { file_put_contents(latestBackupTimestampFile, time()); exec(backupCommand); } 

Вам, однако, понадобится acpi :

 sudo apt install acpi 
  • Восстановить исходный файл из файлов diff для сохранения дискового пространства.
  • Резервное копирование баз данных с помощью cron
  • rsync: Как я могу вытащить файл -exclude-from из удаленного хоста?
  • Резервное копирование логического тома LVM2
  • Как просмотреть файлы и папки, которые не поддерживаются никаким пакетом DEB
  • Копирование / резервное копирование всех файлов, содержащих файлы, соответствующие регулярному выражению
  • Можно ли сохранить конфигурацию рабочего стола KDE?
  • Разрешения файловой системы: пользователь, который может создавать резервные копии всех файлов
  • Найти: кто пишет резервные копии
  • Как восстановить файл с жесткой привязкой
  • Где чашки хранят свою конфигурацию?
  • Interesting Posts

    Как я могу регистрировать всю активность в окне терминала?

    Соображения при размещении исходящего почтового сервера

    Можно ли настроить linux в качестве сервера или рабочей станции в DCS и как?

    Сервер ISC DHCP – восходящая линия клиента не работает

    Linux Mint 18 Cinnamon по умолчанию загружается в оболочку / командную строку / отключает графический интерфейс

    Где скачать исходный код ядра Linux определенной версии?

    Извлечение второго слова из строковой переменной

    Каков программный пакет для создания PDF-документов на ОС Debian и OpenBSD?

    Почему мой файл /etc/hosts.deny игнорируется?

    Состояние аккумулятора Lenovo T440s неизвестно, но зарядка?

    Parallels на Mac – больше не может работать в Ubuntu

    почему медленное обновление df?

    Как назначить ssh переадресованному агенту над файлом удостоверения?

    Объедините два файла по очереди с символом тройного канала разделителя «|||»

    Как я могу безопасно получить версию ksh?

    Linux и Unix - лучшая ОС в мире.