Я хочу запускать команду cron только один раз в день, но не в определенное время, поскольку время работы моего компьютера непредсказуемо.
Могу ли я это сделать?
Я хочу запускать команду cron только один раз в день, но не в определенное время, поскольку время работы моего компьютера непредсказуемо.
Могу ли я это сделать?
anacron
делает это. Просто установите желаемое время, и если ваш компьютер выключится в течение этого времени, он запустится, как только компьютер снова включится.
В зависимости от вашей реализации cron
вы можете использовать @daily
. От man cron
:
Instead of the first five fields, one of eight special strings may
appear:
string meaning
------ -------
@reboot Run once, at startup.
@yearly Run once a year, "0 0 1 1 *".
@annually (same as @yearly)
@monthly Run once a month, "0 0 1 * *".
@weekly Run once a week, "0 0 * * 0".
@daily Run once a day, "0 0 * * *".
@midnight (same as @daily)
@hourly Run once an hour, "0 * * * *".
Я не уверен, как cron
будет справляться с @daily
если ваш компьютер выключен в полночь. Возможно, в следующий раз он запустит работу, но я в этом сомневаюсь. По-видимому, anacron
может сделать это, но я никогда не использовал его. Другое решение состоит в том, чтобы ваша работа создавала файл каждый раз, когда он запускается, а затем пишет скрипт, который проверяет дату изменения файла и снова запускает работу, если она старше одного дня. Например:
#!/usr/bin/env bash
## The command you want to run, change this to whatever
## command you actually want.
COMMAND='echo foo';
## Define the log file
LOGFILE=$HOME/.last_run;
## If the log file doesn't exist, run your command
if [ ! -f $LOGFILE ]; then
## If the command succeeds, update the log file
$COMMAND && touch $LOGFILE
else
## If the file does exist, check its age
AGE=$(stat -c "%Y" $LOGFILE);
## Get the current time
DATE=$(date +%s);
## If the file is more than 24h old, run the command again
if [[ $((DATE - AGE)) -gt 86400 ]]; then
$COMMAND && touch $LOGFILE;
fi
fi
Если вы затем создадите crontab , который будет запускать скрипт каждый час (@hourly
), он будет запускать вашу команду каждый раз, когда прошло 24 часа с момента последнего запуска.