저는 Ubuntu 16.04를 실행하는 노트북에서 일일 백업을 위해 Deja Dup(Ubuntu의 표준 백업 애플리케이션)을 사용합니다. 백업을 생성하려면 많은 전력이 필요하기 때문에 랩톱이 전원에 연결되어 있을 때만 백업이 자동으로 시작되기를 원합니다.
또한 현지 시간(CET/CEST)(24시간제) 8시에서 9시 45분 사이에 백업이 자동으로 시작되는 것을 원하지 않습니다.
마지막으로 매일 여러 개의 백업이 자동으로 생성되는 것을 원하지 않지만 가능하면 백업이 자동으로 생성되기를 바랍니다. 수동으로 시작된 백업이 고려되는지는 상관하지 않습니다.
다음 명령을 사용하여 백업을 시작할 수 있습니다
deja-dup --backup
그러나 다른 응용 프로그램으로 인해 속도가 느려지지 않도록 가장 낮은 우선 순위로 수행되기를 원합니다.
nice -n 19 deja-dup --backup
물론 Deja Dup을 활성화하여 백업을 시작하는 다른 방법도 허용됩니다.
나할 수 있다물론, 내가 원하는 것을 정확히 수행하는 프로그램이나 스크립트를 작성하여 해결책을 찾도록 강요합니다. 그러나 그것은 Linux이고 아마도 더 간단하고 우아한 방법이 있을 것입니다. 여전히 스크립트가 생성될 수도 있지만 솔루션을 강제하면서 생각해낸 것보다 더 짧고 우아할 수도 있습니다. 하지만 이걸 가지고 골프를 치지는 마세요. :디
답변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