user321697 Asked: 2018-11-20 02:52:46 +0800 CST2018-11-20 02:52:46 +0800 CST 2018-11-20 02:52:46 +0800 CST Shell:是否可以在不使用`sleep`的情况下延迟命令? 772 是否有任何替代品、替代品或 bash 技巧可以在不使用的情况下延迟命令sleep?例如,在不实际使用 sleep 的情况下执行以下命令: $ sleep 10 && echo "This is a test" linux bash 10 个回答 Voted Stéphane Chazelas 2018-11-20T03:27:03+08:002018-11-20T03:27:03+08:00 使用bash内置函数,您可以执行以下操作: coproc read -t 10 && wait "$!" || true 休眠 10 秒而不使用sleep. 这样做的coproc目的是使read's 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. Best Answer ss_iwe 2018-11-20T03:28:17+08:002018-11-20T03:28:17+08:00 您有替代方案sleep: 它们是at和cron。与sleep这些相反,您需要提供您需要它们运行的时间。 通过执行确保atd服务正在运行service atd status。 现在假设日期是世界标准时间上午 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 steve 2018-11-20T14:25:35+08:002018-11-20T14:25:35+08:00 其他一些想法。 top -d10 -n2 >/dev/null vmstat 10 2 >/dev/null sar 10 1 >/dev/null timeout 10s tail -f /dev/null mosvy 2018-11-20T09:26:04+08:002018-11-20T09:26:04+08:00 由于有答案建议使用 的非标准-t delay选项read,因此这是一种在标准 shell 中进行超时读取的方法: { ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; } 参数以stty time十分之一秒为单位。 Jeff Schaller 2018-11-20T05:33:50+08:002018-11-20T05:33:50+08:00 使用 bash 内置变量$SECONDS和繁忙循环: for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done Psychonaut 2018-11-20T04:42:49+08:002018-11-20T04:42:49+08:00 在运行 BASIC 的微型计算机时代,延迟通常是通过一个空循环来完成的: FOR I = 1 TO 10000:NEXT 可以使用相同的原理在 shell 脚本中插入延迟: COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done 当然,这种方法的问题在于延迟的长度会因机器的处理器速度而异(甚至在不同负载下的同一台机器上)。与 不同sleep的是,它可能还会最大限度地利用您的 CPU(或其核心之一)。 Fabby 2018-11-20T03:21:36+08:002018-11-20T03:21:36+08:00 书中最古老的把戏: read && echo "This is a test" 只需点击Enter它就会继续! ctrl-alt-delor 2018-11-20T03:20:29+08:002018-11-20T03:20:29+08:00 没有内置的,它的作用与sleep(除非sleep是内置的)相同。但是,还有一些其他命令会等待。 一些包括。 at和cron:用于在特定时间安排任务。 inotifywait: 用于等待文件,或文件被修改/删除/添加/等 Joker_vD 2018-11-21T00:35:20+08:002018-11-21T00:35:20+08:00 来自 Windows 和批处理领域的经典之作: ping -c 11 localhost >/dev/null && echo "This is a test" Edheldil 2018-11-22T07:35:37+08:002018-11-22T07:35:37+08:00 如果您想以交互方式等待文件中的新行,那么tail -f. 等待文件系统的更改?然后使用例如inotify / inoticoming. 还有其他选择,具体取决于您对“等待”的含义。
使用
bash
内置函数,您可以执行以下操作:休眠 10 秒而不使用
sleep
. 这样做的coproc
目的是使read
's stdin 是一个不会有任何东西出来的管道。|| true
是因为的退出状态将反映 SIGALRM 传递,如果设置了该选项wait
,这将导致 shell 退出。errexit
在其他外壳中:
mksh
并且ksh93
有sleep
内置的,在那里使用其他任何东西没有意义(尽管它们都支持read -t
)。zsh
也支持read -t
,但也有一个内置的包装器select()
,所以你也可以使用:如果您想要安排从交互式 shell 会话运行的东西,另请
zsh/sched
参阅zsh
.您有替代方案
sleep
: 它们是at
和cron
。与sleep
这些相反,您需要提供您需要它们运行的时间。通过执行确保
atd
服务正在运行service atd status
。现在假设日期是世界标准时间上午 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
其他一些想法。
由于有答案建议使用 的非标准
-t delay
选项read
,因此这是一种在标准 shell 中进行超时读取的方法:参数以
stty time
十分之一秒为单位。使用 bash 内置变量
$SECONDS
和繁忙循环:在运行 BASIC 的微型计算机时代,延迟通常是通过一个空循环来完成的:
FOR I = 1 TO 10000:NEXT
可以使用相同的原理在 shell 脚本中插入延迟:
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
当然,这种方法的问题在于延迟的长度会因机器的处理器速度而异(甚至在不同负载下的同一台机器上)。与 不同
sleep
的是,它可能还会最大限度地利用您的 CPU(或其核心之一)。书中最古老的把戏:
只需点击Enter它就会继续!
没有内置的,它的作用与
sleep
(除非sleep
是内置的)相同。但是,还有一些其他命令会等待。一些包括。
at
和cron
:用于在特定时间安排任务。inotifywait
: 用于等待文件,或文件被修改/删除/添加/等来自 Windows 和批处理领域的经典之作:
如果您想以交互方式等待文件中的新行,那么
.等待文件系统的更改?然后使用例如
.还有其他选择,具体取决于您对“等待”的含义。