2010-10-18 181 views
15

我只想让bash脚本在调用5分钟后运行。我究竟做错了什么?bash脚本运行5分钟

我有命令:

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

然而在脚本运行的时候了每一次。

回答

42

您立即执行该脚本,将其输出发送到at。您需要将脚本本身的名称发送到at

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

而且downvoter会照顾解释吗? – 2010-10-19 04:23:44

22

怎么样:

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

呀,这曲estion并不真正需要'at'。我建议你使用'&&'而不是';',这样它可以被取消。 – 2010-10-18 23:40:11

+0

不错的增强杰克 – 2010-10-18 23:45:39

+0

在更优雅的伊莫,因为它不挂一个进程。 – Eddie 2012-02-27 19:57:21

1

命令是从左向右计算,所以首先你的脚本执行后,它的输出将通过管道输送到at命令,这是正常行为。请看at man pages了解更多信息。

1

问题是,您正在运行脚本并将输出管道输送至at命令。你需要做的是运行at命令,将脚本路径作为参数。我不确定语法,但at -hman at应该有所帮助。

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

这应该尽可能安排脚本在特定时间运行。有关“at”命令的更多信息,请尝试linuxmanpages.com。我可能错误地认为(目前不在linux系统上测试)。

好运反正

0

试试这个

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