问题描述
我怎样才能每隔一段时间重复一次命令,以便它能够运行命令来检查或监视目录?
不需要脚本,我只需要一个简单的命令就可以在终端中执行。
最佳解决办法
您可以使用watch
命令,watch用于定期运行任何指定的命令。
打开终端并键入:
watch -n x <your command>
将x更改为您想要的秒数。
有关使用watch
命令及其选项的更多帮助,请运行man watch
或访问此Link。
例如:以下内容将在每个60秒的相同终端上列出桌面目录的内容,以便您知道是否发生了任何更改:
watch -n 60 ls -l ~/Desktop
次佳解决办法
除nux的回答外,您还可以在终端中使用此命令:
while true; do <your_command>; sleep <interval_in_seconds>; done
例
while true; do ls; sleep 2; done
该命令将以2秒的间隔打印ls
的输出。
使用Ctrl
+ C
停止该过程。
watch
几乎没有什么缺点
-
它不能使用任何别名命令。
-
如果任何命令的输出很长,滚动无法正常工作。
-
将maximum time interval设置为超出特定值时会遇到一些麻烦。
-
watch
将使用-c
或--color
选项解释传递转义字符的ANSI颜色序列。例如,pygmentize
的输出可以工作,但ls --color=auto
会失败。
在上述情况下,这可能是一个更好的选择。
第三种解决办法
只是想介绍一下souravc和nux的答案:
-
尽管
watch
可以在Ubuntu上正常工作,但如果您希望”Unix-fu”是纯粹的,例如在FreeBSD上,您可能想避免这种情况,watch是一条命令,用于“在另一条tty线上探听”。 -
while true; do command; sleep SECONDS; done
也有一个警告 – 你的命令可能很难用CTR + C来杀死。你可能想要更喜欢while sleep SECONDS; do command; done
–它不仅更短,而且更容易中断。需要注意的是,它会首先睡眠,然后运行命令,因此在命令第一次出现之前您需要等待一些SECONDS
。
第四种办法
听起来像cron
守护进程的理想任务,它允许运行周期性命令。运行crontab -e
命令开始编辑用户的cron配置。其格式记录在crontab(5)中。基本上你有五个time-related,space-separated字段后跟一个命令:
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
命令; credits here:
首先,打开你的.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