電源に接続されている場合にのみバックアップし、一定期間内にのみバックアップします。

電源に接続されている場合にのみバックアップし、一定期間内にのみバックアップします。

私は、Ubuntu 16.04を実行しているラップトップで毎日のバックアップにDeja Dup(Ubuntuの標準バックアップアプリケーション)を使用します。バックアップを作成するには多くの電力が必要なため、ラップトップが電源に接続されている場合にのみバックアップを自動的に開始したいと思います。

また、現地時間(CET / CEST)(24時間制)8時から9時45分の間にバックアップが自動的に開始されることは望ましくありません。

最後に、毎日複数のバックアップを自動的に作成したくはありませんが、可能であればバックアップが自動的に作成されることを願っています。手動で開始されたバックアップが考慮されるかどうかは関係ありません。

次のコマンドを使用してバックアップを開始できます。

deja-dup --backup

しかし、他のアプリケーションによって速度が遅くならないように、最も低い優先順位で実行されることを望んでいます。

nice -n 19 deja-dup --backup

もちろん、Deja Dupを有効にしてバックアップを開始する他の方法も許可されています。

できるもちろん、私が望むことを正確に実行するプログラムやスクリプトを書いて解決策を見つけるように強制します。しかし、それはLinuxであり、おそらくよりシンプルでエレガントな方法があります。それでもスクリプトが生成される可能性がありますが、解決策を強制しながら考えたよりも短くてエレガントになる可能性があります。しかし、これを持ってゴルフをするのはやめましょう。 :D

答え1

私が考えることができる最もエレガントな解決策は、特定の時間内に1日に1回バックアップスクリプトを実行するように調整できる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

答え2

私は基本的に今巨大なハンマーを持ってこの問題を解決するためのスクリプトを書いています。

まず、次のようにPHPコマンドラインインターフェイスをインストールします。

sudo apt install php-cli

PHP 7がインストールされているとします。 PHP 5を使用している場合は、メソッドヘッダー: intからそれを削除してください。determineTimeUntilBackup()

その後、私が書いてからスクリプトをファイルに保存します(絶対に保証できず、テストされていませんが、感じが良く、書いたとき(この回答を投稿する直前)少しとりました)。

#!/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の場合、ダッシュボードで「スタートアップアプリケーション」を開き、新しいアイテムを作成します。コマンドで上記で作成したファイルのパスを入力します。

個人的な状況では、この制限は不要になるため、時間制限のサポートを追加していませんが、簡単に追加できます。


編集:数日間ノートパソコンを電源に接続すると、バッテリーが絶えず放電していることを報告し、数分間ノートパソコンを電源から切り離して再接続するまで、スクリプトがバックアップを作成できないことを確認しました。

この問題を解決するために、バッテリが充電または放電を報告しているかどうかを読み取るのではなく、電源アダプタの状態を読みます。

#!/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

関連情報