经过一定时间后运行命令?

Ani*_*yea 37 shell shell-script delay

如果我正在执行一个很长的过程,有什么办法可以执行一些基于时间的命令吗?

例如,我正在运行一个非常长的进程,大约运行 10 分钟。

5 分钟后,我想运行一个单独的命令。为了说明,单独的命令可以是:echo 5 minutes complete

(注意:我不希望命令的完成进度,而只是在指定的时间间隔后执行的命令。)

是否可以?

Wil*_*ard 42

赶紧跑:

long-command & sleep 300; do-this-after-five-minutes
Run Code Online (Sandbox Code Playgroud)

在do-this-after-five-minutes五分钟后会得到执行。该long-command会在后台运行。

  • 我通常使用`sleep 5m && foobar`,所以如果我改变主意并且^C `sleep`,下一个命令不会运行。 (18认同)

cof*_*Mug 6

为此,有一个衬里:

( ( sleep $TIMEOUT ; echo "5 minutes complete") & $COMMAND )
Run Code Online (Sandbox Code Playgroud)

在您的情况下 TIMEOUT=5m 和 COMMAND 是长命令。

另请参阅我对这篇文章“服务网络重启超时”的回答


Ser*_*rge 5

你可以使用这个脚本:

#!/bin/bash

TEMPFILE="$(mktemp)"
STARTTIME="$(date +%s)"
(./longprocess; rm -f "$TEMPFILE") &
while [ -f "$TEMPFILE" ]; do
    sleep 1s
    NOW="$(date +%s)"
    if (( (NOW-STARTTIME) % 300 == 0 )); then
        echo "$(( (NOW-STARTTIME)/60 )) minute(s) elapsed"
    fi
done
echo "Done!!!"
Run Code Online (Sandbox Code Playgroud)

它longprocess在 a 中执行sub-shell,然后监视先前创建的“锁定”文件是否存在。

  • 检查“man bash”是否为“SECONDS”。您可以在脚本启动时设置 `SECONDS=0` 并且只检查大于或等于 300 或设置 `SECONDS=$((date +%s))` 而忘记在脚本中再次使用 `date`... (2认同)