2

Я хочу запускать команду cron только один раз в день, но не в определенное время, поскольку время работы моего компьютера непредсказуемо.

Могу ли я это сделать?

2 ответа2

3

anacron делает это. Просто установите желаемое время, и если ваш компьютер выключится в течение этого времени, он запустится, как только компьютер снова включится.

3

В зависимости от вашей реализации 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 часа с момента последнего запуска.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .