![Shell:是否可以在不使用“睡眠”的情况下延迟命令?](https://linux22.com/image/144286/Shell%EF%BC%9A%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%B8%8D%E4%BD%BF%E7%94%A8%E2%80%9C%E7%9D%A1%E7%9C%A0%E2%80%9D%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E5%BB%B6%E8%BF%9F%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
是否有任何替代品、替代方案或 bash 技巧可以在不使用 的情况下延迟命令sleep
?例如,执行以下命令而不实际使用睡眠:
$ sleep 10 && echo "This is a test"
答案1
使用bash
内置函数,您可以执行以下操作:
coproc read -t 10 && wait "$!" || true
不使用时休眠 10 秒sleep
。其coproc
目的是使read
stdin 成为一个永远不会输出任何内容的管道。|| 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
: 它们是at
和cron
。与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(或其核心之一)。