是否有替代品,替代品或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提到的,你还可以添加分钟时间at
command.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
?