【问题标题】:bash script to run in 5 minutesbash 脚本在 5 分钟内运行
【发布时间】:2010-10-18 23:23:11
【问题描述】:

我只希望 bash 脚本在它被调用 5 分钟后运行。我做错了什么?

我有命令:

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

但脚本每次都会立即运行。

【问题讨论】:

    标签: bash timed


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      怎么样:

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

      【讨论】:

      • 是的,这个问题真的不需要at。我建议你使用&& 而不是;,这样可以取消。
      • at 更优雅,因为它不会挂起进程。
      • 是的,我用这个来关机sleep 300 && shutdown -h now
      • 使用 seep 进行关机没有意义,因为关机本身集成了一个方便的计时器shutdown -P +5
      【解决方案3】:
      at -f /path/to/my/script -t now +5 minutes
      

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

      祝你好运

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          命令是从左到右评估的,所以首先你的脚本被执行,它的输出将被传送到 at 命令,这是正常的行为。请查看at man pages 了解更多信息。

          【讨论】:

            【解决方案6】:

            试试这个

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-28
              • 1970-01-01
              • 2014-05-20
              • 1970-01-01
              • 2018-06-17
              • 1970-01-01
              相关资源
              最近更新 更多