Скрипт bash для запуска за 5 минут

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

У меня есть команда:

/path/to/my/script | at now + 5 min

И все же сценарий запускается сразу каждый раз.

6 ответов

Решение

Вы немедленно выполняете скрипт и отправляете его вывод в at, Вам нужно отправить имя самого скрипта в at:

echo /path/to/my/script | at now + 5 min

Как насчет:

sleep 300 && /path/to/my/script
at -f /path/to/my/script -t now +5 minutes

Это должно сработать, если запланировать запуск сценария в определенное время. Для получения дополнительной информации о " at msgstr "команда try http://linuxmanpages.com/man1/at.1.php. Возможно, я ошибаюсь (в настоящее время нет системы linux для тестирования).

Удачи в любом случае

Проблема в том, что вы запускаете сценарий и передаете вывод в at команда. Что вам нужно сделать, это запустить at команда с путем к вашему сценарию в качестве параметра. Я не уверен в синтаксисе, но at -h или же man at должно помочь

Команды оцениваются слева направо, поэтому сначала выполняется ваш скрипт, его вывод будет передан в команду at, это нормальное поведение. Взгляните на справочные страницы для получения дополнительной информации.

Попробуй это

sys.scheduled_run /path/to/my/script 5

основная функция

function sys.scheduled_run(){
    local PATH_TO_ACTION MINS SLEEPTIME
    PATH_TO_ACTION=$1
    MINS=$2
    SLEEPTIME=$(($MINS * 60))
    echo "Sleeping for $MINS minute ($SLEEPTIME seconds) and then running $PATH_TO_ACTION"
    ui.countdown $SLEEPTIME
    $PATH_TO_ACTION
    echo "Done"
    if [ "REPEAT" == "$3" ] 
    then
        echo "Going for Repeat"
        sys.scheduled_run "$@"
    fi
}

функция обратного отсчета

function ui.countdown(){ #USAGE ui.countdown 60 countdown for 60 seconds
        local SECONDS=$1
        local START=$(date +%s)
        local END=$((START + SECONDS))
        local CUR=$START
        while [[ $CUR -lt $END ]]
        do
                CUR=$(date +%s)
                LEFT=$((END-CUR))

                printf "\r%02d:%02d:%02d" \
                        $((LEFT/3600)) $(( (LEFT/60)%60)) $((LEFT%60))

                sleep 1
        done
        echo "        "
}
Другие вопросы по тегам