2010-10-18 11 views
15

Voglio solo uno script bash da eseguire 5 minuti dopo la chiamata. Che cosa sto facendo di sbagliato?script bash da eseguire in 5 minuti

ho il comando:

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

Eppure lo script viene eseguito subito ogni volta.

risposta

42

si sta eseguendo immediatamente la sceneggiatura e l'invio sua uscita in at. È necessario inviare il nome dello script stesso in at:

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

E il downferer dovrebbe preoccuparsi di spiegarlo? –

22

come circa:

sleep 300 && /path/to/my/script 
+6

Sì, questo qu l'estione non aveva davvero bisogno di "a". Ti suggerisco di usare '&&' invece di ';', quindi può essere cancellato. –

+0

Nice enhancement Jack –

+0

at è più grazioso in quanto non appende un processo. – Eddie

1

I comandi vengono valutati da sinistra a destra, quindi prima lo script viene eseguito, l'uscita di esso sarà reindirizzato al comando AT, questo è un comportamento normale . Dai un'occhiata allo at man pages per maggiori informazioni.

1

Il problema è che si sta eseguendo lo script e si esegue il piping dell'output al comando at. Quello che devi fare è eseguire il comando at con il percorso del tuo script come parametro. Non sono sicuro della sintassi, ma at -h o man at dovrebbe essere d'aiuto.

6
at -f /path/to/my/script -t now +5 minutes 

Questo dovrebbe funzionare fino alla pianificazione di uno script da eseguire in un momento specifico. Per ulteriori informazioni sul comando "at" provare linuxmanpages.com. Potrei sbagliarmi a pensare (attualmente non su un sistema linux per testare).

Buona fortuna comunque

0

provare questo

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

funzione principale

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 "[email protected]" 
    fi 
} 

funzione di conto alla rovescia

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