在终端中每隔 x 时间间隔重复一次命令?

172 command-line bash scripts monitoring

如何在每个时间间隔重复一个命令,以便它允许我运行命令以进行检查监视 目录的?

不需要脚本,我只需要在终端中执行一个简单的命令。

nux*_*nux 243

您可以使用 watch命令,观察用于定期运行任何指定的命令。

打开终端并输入:

watch -n x <your command>
Run Code Online (Sandbox Code Playgroud)

改变x为您想要的时间(以秒为单位)。

有关使用该watch命令及其选项的更多帮助,请运行man watch或访问此链接

例如:以下将每隔60 秒在同一终端上列出Desktop 目录的内容,以便您知道是否发生了任何更改:

watch -n 60 ls -l ~/Desktop
Run Code Online (Sandbox Code Playgroud)

  • +1 但在使用扩展时要小心。例如,尝试调整终端大小时 `watch -n 1 'echo $COLUMNS'` 和 `watch -n 1 echo $COLUMNS` 之间的区别 - 前者每秒扩展一次,但后者仅扩展一次 *before* `watch` 开始。 (37认同)
  • 有什么方法可以将 `watch` 与“启用历史记录”类型的命令一起使用?我喜欢使用 `watch`,但有时我更喜欢查看以前执行的日志,而不仅仅是最后一个。是的,我知道我可以使用脚本(`while true`)来实现这一点,但是使用 `watch` 实用程序要干净得多! (2认同)
  • `-bash:监视:未找到命令`,macOS 10.14.1 (2认同)

sou*_* c. 108

除了nux 的回答之外,您还可以在终端中使用此命令:

while true; do <your_command>; sleep <interval_in_seconds>; done
Run Code Online (Sandbox Code Playgroud)

例子:

while true; do ls; sleep 2; done
Run Code Online (Sandbox Code Playgroud)

此命令将打印输出 ls2 秒的间隔。

使用Ctrl+C停止该过程。

有几个缺点watch

  • 它不能使用任何别名命令。
  • 如果任何命令的输出很长,滚动就不能正常工作。
  • 最大时间间隔设置为超过某个值会有些麻烦。
  • watch将解释使用-c--color选项传递转义字符的 ANSI 颜色序列。例如输出pygmentize将工作,但它会失败ls --color=auto

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

  • 我并不是说首先要使用这个答案。`watch` 在大多数情况下是好的。这就是为什么我在开头提到“除了nux的答案”。但是`watch` 有一些问题,例如一个**不能使用`watch`** 的任何别名命令。以 `ll` 为例,它是 `ls -laF` 的别名,但不能与 `watch` 一起使用。此外,如果任何命令的输出很长,您在使用 `watch` 滚动时会遇到麻烦。在这几个特殊情况下,这个答案可能是一个更好的选择。 (14认同)
  • `而 sleep x` 更好 - 它更容易杀死。 (9认同)
  • 这是一个不错的选择,与 `watch` 不同,它保留命令历史记录。 (5认同)

d33*_*tah 38

只是想加入sourav c。's 和nux的答案:

  1. 虽然watch在 Ubuntu 上可以完美运行,但如果你希望你的“Unix-fu”是纯的,你可能想避免这种情况。例如,在 FreeBSD 上,watch是一个“窥探另一条 tty 线路”的命令。

  2. while true; do command; sleep SECONDS; done还有一个警告:使用Ctrl+可能更难杀死您的命令C。您可能更喜欢:

    while sleep SECONDS; do command; done
    
    Run Code Online (Sandbox Code Playgroud)

    它不仅更短,而且更容易中断。需要注意的是,它将首先休眠,然后运行您的命令,因此您需要等待一段时间SECONDS才能第一次出现该命令。


Lek*_*eyn 14

听起来像是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)
Run Code Online (Sandbox Code Playgroud)

例如,如果您想在每周二的上午 11 点运行 Python 脚本:

0 11 * * 1 python ~/yourscript.py
Run Code Online (Sandbox Code Playgroud)

还有一些特殊的名称可以代替时间,例如@reboot. 如果您需要创建临时目录,则非常有用。从我的 crontab(列出crontab -l):

# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
Run Code Online (Sandbox Code Playgroud)

  • 问题询问如何在终端中定期运行某些东西。`cron` 在幕后而不是在终端中运行 (5认同)

X T*_*ian 5

如果您正在监视文件系统,则 inotifywait它非常棒,并且肯定会给您的系统增加更少的负载。

例子 :

第一个终端中输入以下命令:

$ inotifywait .
Run Code Online (Sandbox Code Playgroud)

然后在第二个终端中,任何影响当前目录的命令,

$ touch newfile
Run Code Online (Sandbox Code Playgroud)

然后在原来的终端中,inotifywait 会唤醒并报告事件

./ CREATE newfile2
Run Code Online (Sandbox Code Playgroud)

或者在一个循环中

$ 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.
Run Code Online (Sandbox Code Playgroud)

  • 我没有告诉他写一个脚本,我建议如果他们为了观察特定的文件系统事件而循环,那么 inotifywait 很有用,并且比重复命令使用更少的资源。我经常在命令行上运行几个命令,例如`grep something InALogFile|less` 是一个脚本吗? (3认同)
  • 有什么比 `.` 更简单的了,我不能遗漏这个命令。 (3认同)

May*_*hux 5

您可以使用 crontab。运行命令crontab -e并使用您喜欢的文本编辑器打开它,然后添加这一行

*/10 * * * *  /path-to-your-command
Run Code Online (Sandbox Code Playgroud)

这将每 10 分钟运行一次您的命令

* */4 * * *  /path-to-your-command
Run Code Online (Sandbox Code Playgroud)

这将每 4 小时运行一次您的命令

另一种可能的解决方案

$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
Run Code Online (Sandbox Code Playgroud)

X次重复。

Y时间等待重复。

例子 :

$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以repeat按照以下步骤创建自己的命令;学分在这里

首先,打开你的.bash_aliases文件:

$ xdg-open ~/.bash-aliases
Run Code Online (Sandbox Code Playgroud)

其次,将这些行粘贴到文件底部并保存:

repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
    "$@"
done
}
Run Code Online (Sandbox Code Playgroud)

第三,关闭并再次打开您的终端,或输入:

$ source ~/.bash_aliases
Run Code Online (Sandbox Code Playgroud)

等等!您现在可以像这样使用它:

$ repeat 5 echo Hello World !!!
Run Code Online (Sandbox Code Playgroud)

或者

$ repeat 5 ./myscript.sh
Run Code Online (Sandbox Code Playgroud)