скрипт bash для запуска за 5 минут - PullRequest
18 голосов
/ 19 октября 2010

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

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

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

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

Ответы [ 6 ]

46 голосов
/ 19 октября 2010

Вы немедленно выполняете скрипт и отправляете его вывод в at.Вам необходимо отправить имя самого скрипта в at:

echo /path/to/my/script | at now + 5 min
24 голосов
/ 19 октября 2010

как насчет:

sleep 300 && /path/to/my/script
6 голосов
/ 19 октября 2010
at -f /path/to/my/script -t now +5 minutes

Это должно сработать, если запланировать запуск сценария в определенное время.Для получения дополнительной информации о команде "at" попробуйте linuxmanpages.com .Я могу ошибаться (в настоящее время не для тестирования в системе Linux).

В любом случае, удачи

1 голос
/ 19 октября 2010

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

1 голос
/ 19 октября 2010

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

0 голосов
/ 21 мая 2011

попробуйте

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 "        "
}
...