Fazer backup somente quando conectado à energia e somente dentro da janela de tempo

2

Eu faço backups diários usando o Deja Dup (o aplicativo de backup padrão do Ubuntu) no meu laptop executando o Ubuntu 16.04. Criar um backup requer muito poder, e é por isso que eu só quero que um backup seja iniciado automaticamente se meu laptop estiver conectado à energia.

Além disso, não quero que um backup seja iniciado automaticamente das 8:00 às 9:45 (24 horas do sistema), hora local (que é CET / CEST).

Por último, não quero que mais de um backup por dia seja criado automaticamente, mas que os backups sejam criados automaticamente, se possível. Eu não me importo se um backup manualmente iniciado manualmente é considerado.

Um backup pode ser iniciado usando o comando

deja-dup --backup

, no entanto, eu gostaria que fosse feito com prioridade mínima para que outros aplicativos não sejam retardados por isso, então seria:

nice -n 19 deja-dup --backup

Naturalmente, outros meios de tornar o Deja Dup iniciar um backup também são aceitáveis.

Eu poderia , claro, forçar meu caminho para uma solução, escrevendo um programa ou script fazendo exatamente o que eu quero. No entanto, é o Linux e provavelmente há uma maneira mais fácil e elegante. Eu acho que provavelmente ainda irá resultar em um script, mas provavelmente pode ser muito mais curto e mais elegante do que o que eu faria quando forçando o caminho para uma solução. Mas por favor não jogue golfe com este. : D

    
por UTF-8 10.01.2017 / 00:54

2 respostas

0

Eu basicamente peguei uma marreta gigante e matei o problema escrevendo um script.

Primeiro, instale a interface de linha de comando do PHP, por exemplo via

sudo apt install php-cli

Estou supondo que o PHP 7 esteja instalado. Se você usa o PHP 5, remova : int do cabeçalho do método determineTimeUntilBackup() .

Em seguida, salve o script a seguir que eu escrevi (que não tem nenhuma garantia e não foi testado, mas tenho um bom pressentimento sobre isso e fiquei um pouco bêbado ao escrevê-lo (antes de postar essa resposta)) em um arquivo :

#!/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);
}

Tornar o arquivo executável, por exemplo, via:

chmod 755 backup.php

Em seguida, adicione o arquivo aos aplicativos de inicialização. Como isso é feito depende da sua distro. Para o Ubuntu, abra "Startup Applications" do painel e crie uma nova entrada. Como o comando, basta digitar o caminho do arquivo criado acima.

Eu não adicionei suporte para a restrição na hora do dia, já que minha circunstância pessoal exige que isso não exista mais, mas pode ser facilmente adicionado.

Editar: notei que os relatórios da bateria estão descarregando o tempo todo se meu laptop estiver conectado à energia elétrica por vários dias, fazendo com que o script não crie backups até que eu desconecte meu laptop por vários minutos e reconecte-o .

Para resolver esse problema, ele agora não lê se a bateria relata estar carregando ou descarregando, mas em vez disso lê o estado do adaptador de energia:

#!/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);
}

Você precisará, no entanto, de acpi :

sudo apt install acpi
    
por 07.02.2017 / 22:36
0

A solução mais elegante que posso imaginar é configurar um crontab que possa ser ajustado para executar uma vez por dia seu script de backup também em um determinado período de tempo.

Para a verificação "ligado à energia", este comando funciona no meu caso:

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

Você pode incluir isso em seu script assim:

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