Shell:是否可以在不使用“睡眠”的情况下延迟命令?

Shell:是否可以在不使用“睡眠”的情况下延迟命令?

是否有任何替代品、替代方案或 bash 技巧可以在不使用 的情况下延迟命令sleep?例如,执行以下命令而不实际使用睡眠:

$ sleep 10 && echo "This is a test"

答案1

使用bash内置函数,您可以执行以下操作:

coproc read -t 10 && wait "$!" || true

不使用时休眠 10 秒sleep。其coproc目的是使readstdin 成为一个永远不会输出任何内容的管道。|| true是因为的退出状态将反映 SIGALRM 传递,如果设置了wait该选项,这将导致 shell 退出。errexit

在其他外壳中:

mksh并且ksh93具有sleep内置功能,没有必要使用其他任何东西(尽管它们也都支持read -t)。

zsh也支持read -t,但也有一个内置的包装器select(),所以你也可以使用:

zmodload zsh/zselect
zselect -t 1000 # centiseconds

如果您想要安排从交互式 shell 会话运行的内容,另请参阅zsh/sched模块输入zsh

答案2

您可以选择sleep: 它们是atcron。与sleep这些相反,您需要提供您需要它们运行的​​时间。

  • atd通过执行确保服务正在运行service atd status
    现在假设日期是 UTC 时间上午 11:17;如果您需要在 11:25 UTC 执行命令,语法为:echo "This is a test" | at 11:25
    现在请记住,atd默认情况下不会记录作业的完成情况。更多请参考这个关联。您的应用程序最好有自己的日志记录。

  • 您可以在 中安排作业cron,更多信息请参阅:man cron查看其选项或crontab -e添加新作业。/var/log/cron可以检查有关作业执行的信息。

仅供参考,sleep system call 暂停当前执行并根据传递给它的参数来安排它。

编辑:

正如@Gaius提到的,您还可以在at命令中添加分钟时间。但是假设时间是12:30:30,现在您运行了调度程序now +1 minutes。尽管指定了 1 分钟(即 60 秒),但at实际上并没有等到12:31:30执行作业,而是在 处执行作业12:31:00。时间单位可以是minutes, hours, days, or weeks。更多参考man at

例如:echo "ls" | at now +1 minutes

答案3

其他一些想法。

top -d10 -n2 >/dev/null

vmstat 10 2 >/dev/null

sar 10 1 >/dev/null

timeout 10s tail -f /dev/null

答案4

在运行 BASIC 的微型计算机时代,延迟通常是通过空循环来完成的:

FOR I = 1 TO 10000:NEXT

可以使用相同的原理在 shell 脚本中插入延迟:

COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done

当然,这种方法的问题在于,延迟的长度会根据不同机器的处理器速度(甚至在不同负载下的同一台机器上)而有所不同。与 不同的是sleep,它也可能会最大化您的 CPU(或其核心之一)。

相关内容