在终端每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将失败。

在上述情况下,这似乎是一个更好的选择。

只想进入souravcnux的答案:

  1. 虽然watch会在Ubuntu上完美运行,你可能想要避免这种情况,如果你想让你的“Unix-fu”变得纯粹 – 例如,在FreeBSD上,watch是一个“窥探另一条线”的命令。
  2. 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