是否有替代品,替代品或bash技巧来延迟不使用命令sleep?例如,执行以下命令而不实际使用sleep:
$ sleep 10 && echo "This is a test"
at可能是一个,但是我找不到任何用法示例。
是否有替代品,替代品或bash技巧来延迟不使用命令sleep?例如,执行以下命令而不实际使用sleep:
$ sleep 10 && echo "This is a test"
at可能是一个,但是我找不到任何用法示例。
Answers:
您可以选择sleep:它们是at和cron。与sleep这些需求相反,您需要提供它们运行的时间。
atd通过执行确保服务正在运行service atd status。
现在假设日期是世界标准时间上午11:17;如果您需要在世界标准时间11:25执行命令,则语法为:echo "This is a test" | at 11:25。
现在请记住,atd默认情况下不会记录作业的完成情况。有关更多信息,请参见此链接。最好您的应用程序具有自己的日志记录。
您可以在中安排作业cron,更多信息请参见:man cron以查看其选项或crontab -e添加新作业。/var/log/cron可以检查有关作业执行的信息。
FYI sleep system call 暂停当前执行并安排传递给它的参数。
编辑:
作为@Gaius提到的,你还可以添加分钟时间atcommand.But可以说,时间是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
用 bash内建函数,您可以执行以下操作:
coproc read -t 10 && wait "$!" || true
不使用睡10秒钟sleep。该coproc是让让read的stdin是一个管道,在那里什么都不会出来。|| true这是因为wait的退出状态将反映SIGALRM交付,如果errexit设置了该选项,则将导致外壳退出。
在其他shell中:
mksh并ksh93有sleep内置功能,因此在那里使用其他任何东西都没有意义(尽管它们都支持read -t)。
zsh还支持read -t,但周围也有内置包装器select(),因此您还可以使用:
zmodload zsh/zselect
zselect -t 1000 # centiseconds
如果要调度从交互式Shell会话中运行的程序,请参见中的zsh/sched模块zsh。
read -t 10 < /dev/zero || true吗?
read可以使用select(2)或类似的东西来实现任何shell (这意味着超时读取将很好地解决这个问题)。我表示惊讶而不是与您矛盾,但是您能指出对此进行进一步讨论吗?
/dev/zero是一个包含无限量数据(NUL字节)的文件。因此read,在这10秒钟内将尽可能多地阅读。值得庆幸的是,在bash不支持将NUL字节存储在其变量中的情况下,它不会占用任何内存,但仍会占用CPU资源。
/dev/stdout将是tty设备,因此会产生副作用(例如,如果在后台运行则停止脚本),并且例如在用户按下Enter键时返回。read -t 10 /dev/stdout | :可以在Linux上运行,但只能在Linux上运行,而coproc与操作系统无关。
其他一些想法。
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
使用bash内置变量$SECONDS和繁忙循环:
for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
在运行BASIC的微型计算机时代,延迟通常是通过一个空循环来完成的:
FOR I = 1 TO 10000:NEXT
可以使用相同的原理在Shell脚本中插入延迟:
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
当然,这种方法的问题在于,延迟的长度会根据机器的处理器速度(甚至在不同负载下的同一台机器上)而在机器之间变化。与不同sleep,它可能还会使您的CPU(或其内核之一)达到最大。
没有内置功能,其功能与之相同sleep(除非sleep是内置功能)。但是,还有其他一些命令将等待。
一些包括。
at和cron:用于在特定时间安排任务。
inotifywait:用于等待文件,或文件被修改/删除/添加/等
at?
cron将任务存储在中crontab,对吗?at计划的数据存储在哪里?
sleep?