在终端每x个时间间隔重复一次命令?
如何在每个时间间隔重复一个命令,以便它允许我运行命令来检查或监视目录?
不需要脚本,我只需要在终端中执行一个简单的命令。
你也可以在终端中使用这个命令,除了nux的答案:
while true; do ; sleep ; done
例
while true; do ls; sleep 2; done
此命令将以2秒的间隔打印ls
输出。
使用Ctrl + C停止该过程。
watch
有一些缺点
- 它不能使用任何别名命令。
- 如果任何命令的输出很长,则滚动无法正常工作。
- 将最大时间间隔设置为超出特定值会有一些麻烦。
-
watch
将使用-c
或--color
选项解释传递转义字符的ANSI颜色序列。 例如,pygmentize
输出将起作用,但对于ls --color=auto
将失败。
在上述情况下,这似乎是一个更好的选择。
只想进入souravc和nux的答案:
- 虽然
watch
会在Ubuntu上完美运行,你可能想要避免这种情况,如果你想让你的“Unix-fu”变得纯粹 – 例如,在FreeBSD上,watch是一个“窥探另一条线”的命令。 -
while true; do command; sleep SECONDS; done
while true; do command; sleep SECONDS; done
也有一个警告 – 使用CTR + C你的命令可能更难杀死。while sleep SECONDS; do command; done
你可能想要更喜欢while sleep SECONDS; do command; done
while sleep SECONDS; do command; done
while sleep SECONDS; do command; done
– 它不仅更短,而且更容易打断。 需要注意的是,它将首先进入睡眠状态,然后运行命令,因此在第一次发生命令之前,您需要等待一些SECONDS
。
听起来像cron
守护进程的理想任务,它允许运行定期命令。 运行crontab -e
命令开始编辑用户的cron配置。 其格式记录在crontab(5)中 。 基本上你有五个与时间相关的,以空格分隔的字段,后跟一个命令:
The time and date fields are: field allowed values ----- -------------- minute 0-59 hour 0-23 day of month 1-31 month 1-12 (or names, see below) day of week 0-7 (0 or 7 is Sunday, or use names)
例如,如果您想在每个星期二上午11点运行Python脚本:
0 11 * * 1 python ~/yourscript.py
还有一些特殊的名称可以取代时间,比如@reboot
。 如果您需要创建临时目录,非常有用。 从我的crontab(与crontab -l
一起列出):
# Creates a temporary directory for ~/.distcc at boot @reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
如果您正在监视文件系统,那么inotifywait
非常棒,并且肯定会增加系统负载。
示例:
在第一个终端输入此命令:
$ inotifywait .
然后在第二个终端,任何影响当前目录的命令,
$ touch newfile
然后在原始终端中,inotifywait将唤醒并报告该事件
./ CREATE newfile2
或者在一个循环中
$ while true ; do inotifywait . ; done Setting up watches. Watches established. ./ OPEN newfile2 Setting up watches. Watches established. ./ OPEN newfile2 Setting up watches. Watches established. ./ DELETE newfile Setting up watches. Watches established. ./ CREATE,ISDIR newdir Setting up watches. Watches established.
您可以创建自己的repeat
命令,执行以下步骤; 学分 :
首先,打开.bash_aliases
文件:
$ xdg-open ~/.bash-aliases
其次,将这些行粘贴到文件的底部并保存:
repeat() { n=$1 shift while [ $(( n -= 1 )) -ge 0 ] do "$@" done }
第三,关闭并再次打开您的终端,或键入:
$ source ~/.bash_aliases
Etvoilà! 您现在可以像这样使用它:
$ repeat 5 echo Hello World !!!
要么
$ repeat 5 ./myscript.sh
你可以使用crontab。 运行命令crontab -e
并使用首选文本编辑器打开它,然后添加此行
*/10 * * * * /path-to-your-command
这将每10分钟运行一次命令
* */4 * * * /path-to-your-command
这将每4小时运行一次命令
另一种可能的解决
$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
X重复次数。
是时候等了再说一遍。
示例:
$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
上面提出的“观察”方法的另一个问题是它仅在完成该过程时才显示结果。 “date; sleep 58; date”将仅在59秒后显示2个日期…如果你开始运行4分钟的东西,那么慢慢显示多页内容,你就不会真正看到它。
另一方面,对“while”方法的关注是它不考虑任务持续时间。
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
有了这个,脚本将每分钟运行一次,有时可能需要1m40。 因此,即使一个cron能够每分钟运行一次,这里也不会。
因此,要查看shell生成的输出并等待确切的请求时间,您需要查看之前和之后的时间,并循环使用while。
就像是:
while ( true ); do echo Date starting `date` before=`date +%s` sleep `echo $(( ( RANDOM % 30 ) + 1 ))` echo Before waiting `date` after=`date +%s` DELAY=`echo "60-($after-$before)" | bc` sleep $DELAY echo Done waiting `date` done
这将输出:
如您所见,该命令每分钟运行一次:
Date starting Mon Dec 14 15:49:34 EST 2015 Before waiting Mon Dec 14 15:49:52 EST 2015 Done waiting Mon Dec 14 15:50:34 EST 2015 Date starting Mon Dec 14 15:50:34 EST 2015 Before waiting Mon Dec 14 15:50:39 EST 2015 Done waiting Mon Dec 14 15:51:34 EST 2015
因此,只需将“sleep echo $(( ( RANDOM % 30 ) + 1 ))
”命令替换为您想要的,并且将在终端/ shell上运行,只需每分钟运行一次。 如果您想要另一个时间表,只需根据需要更改“60”秒。
没有调试行的较短版本:
while ( true ); do before=`date +%s` sleep `echo $(( ( RANDOM % 30 ) + 1 ))` # Place you command here after=`date +%s` DELAY=`echo "60-($after-$before)" | bc` sleep $DELAY done