在Linux中自动重复命令


303

在Linux命令行中是否可以每n秒重复一次命令?

说,我正在运行导入,我正在做

ls -l

检查文件大小是否正在增加。我想要一个命令来自动重复此操作。

Answers:


541

每5秒观看一次...

watch -n 5 ls -l

如果希望对更改进行视觉确认,请--differencesls命令前附加。

根据OSX手册页,

--cumulative选项突出显示“粘滞”,显示所有已更改位置的运行显示。-t或--no-title选项将关闭显示顶部的间隔,命令和当前时间的标题,以及以下空白行。

Linux / Unix手册页可以在这里找到


4
尼斯-关于它不将结果附加到命令行的
马蒂·华莱士

1
新增了选项,可以突出显示更改
Rawkode 2012年

3
请注意,您需要转义正在观看的命令中的特殊字符,例如: watch mysql dbname -e \"show processlist\;\"
pfrenssen 2013年

11
brew install watch
2013年

1
手表上没有安装Mac OS X的10.10
若奥·努涅斯

118
while true; do
    sleep 5
    ls -l
done

10
watch还具有清除屏幕的不幸副作用,因此有时循环很有用。使用哪种取决于输出的所需格式。
威廉·珀塞尔

我通常会做循环,但要一行完成。手表看起来要好得多,但是,我必须切换到该手表。
唐·布兰森

1
@MartyWallace这可以通过命令行(while循环)完成。
按键

值得注意的是,您可以用来--differences突出显示它们(如果您担心终端的重新
粉刷

这比更好watch。例如,当您希望在每次调用中生成随机数(例如)时,监视功能将不起作用watch -n 1 echo ${RANDOM}。随机只会被调用一次。
Marcin

92

“监视”不允许在Busybox中使用几分之一秒,而“睡眠”允许。如果这对您很重要,请尝试以下操作:

while true; do ls -l; sleep .5; done

1
如果您需要将输出传递到某个地方(例如bar aint递归),这很有用
Stephen Smith

1
谢谢。这适用于没有watch命令的busybox控制台。我用它来衡量系统的正常运行时间:正常运行时间;睡1; 完成
圣地亚哥·比利亚弗尔特

我坚持使用的旧版本的busybox(v1.11.2)上的FWIW,没有手表,并且睡眠不支持小数。但是您可以成功使用sleep 1。
moodboom

这也是在Cygwin中执行此操作的好方法
Bradley


18

如果命令包含一些特殊字符,例如管道和引号,则该命令需要用引号填充。例如,要重复执行ls -l | grep "txt",watch命令应为:

watch -n 5 'ls -l | grep "txt"'


我在让手表在管道表达式上正常工作时遇到了麻烦,但是阅读
此书

13

使用时,可以不使用cron定期运行命令while

作为命令:

while true ; do command ; sleep 100 ; done &
[ ex: # while true;  do echo `date` ; sleep 2 ; done & ]

例:

while true
do echo "Hello World"
sleep 100
done &

不要忘记最后一个,&因为它将使您的循环处于后台。但是您需要使用命令“ ps -ef | grep your_script”找到进程ID,然后将其杀死。因此,请在运行脚本时添加“&”。

# ./while_check.sh &

这是与脚本相同的循环。创建文件“ while_check.sh”并将其放入其中:

#!/bin/bash
while true; do 
    echo "Hello World" # Substitute this line for whatever command you want.
    sleep 100
done

然后输入以下内容运行 bash ./while_check.sh &


最后的&不同于最后没有&编写命令,而是用&调用脚本:bash ./while_check.sh&吗?
ransh 2013年

@ransh:我们可以运行脚本./while_check.sh&,因此我们可以立即获取进程ID,当我们在脚本中添加&并只运行不带&的脚本时,我们没有任何进程ID,但是它将运行背景,如我所编辑,如果我们需要停止脚本,则需要ps命令来获取进程ID。
Ranjithkumar T

如果愿意,可以echo $!在启动每个后台进程之后将脚本修改为—这是在后台启动的最后一个子进程的PID。
乔纳森·莱夫勒

echo `date` 只是一种糟糕的,有点错误的写作方式date。(该错误与缺少对。的引用有关echo。)另请参见无用echo
Tripleee


6

如果您想避免“漂移”,这意味着您希望该命令每N秒执行一次,而不管该命令花费了多长时间(假设它花费的时间少于N秒),这里有一些bash会每5秒重复一次命令,秒精度(如果无法跟上,则会打印出警告):

PERIOD=5

while [ 1 ]
do
    let lastup=`date +%s`
    # do command
    let diff=`date +%s`-$lastup
    if [ "$diff" -lt "$PERIOD" ]
    then
        sleep $(($PERIOD-$diff))
    elif [ "$diff" -gt "$PERIOD" ]
    then
        echo "Command took longer than iteration period of $PERIOD seconds!"
    fi
done

由于睡眠仅精确到一秒钟,因此它可能仍会漂移一些。您可以通过创造性地使用date命令来提高此准确性。


谢谢..但是我有两个问题,1-在哪里保存该代码?换句话说,应该将包含该脚本的文件放在哪个路径中?使其自动运行?!2-如何在(#do command)中包含php文件,而不是在那里输入我的所有代码?
Hossam

1
我建议您对bash脚本进行一些研究,以便您了解如何运行它们的基础知识等等。
mcote

4

如果要执行特定次数的操作,可以始终执行以下操作:

repeat 300 do my first command here && sleep 1.5

8
为bash做for x in {1..300} ; do 命令 ||break;sleep 1.5; done
Jasen


2

为了更轻松地将漂移降至最低,请使用:

while :; do sleep 1m & some-command; wait; done

由于bash运行循环结构的时间和实际执行sleep命令的时间,仍然会有少量漂移。

提示:':'等于0,即为true。


1
watch -n 5 'ls -l 

将运行ls -l每5秒后命令

输出:-

Every 5.0s: ls -l                                                                                                      Fri Nov 17 16:28:25 2017

total 169548
-rw-rw-r--  1 sachin sachin     4292 Oct 18 12:16 About_us_Admission.doc
-rw-rw-r--  1 sachin sachin      865 Oct 13 15:26 About_us_At_glance.doc
-rw-rw-r--  1 sachin sachin     1816 Oct 13 16:11 About_us_Principle.doc
-rw-rw-r--  1 sachin sachin     1775 Oct 13 15:59 About_us_Vission_mission.doc
-rw-rw-r--  1 sachin sachin     1970 Oct 13 16:41 Academic_Middle_school.doc
-rw-rw-r--  1 sachin sachin      772 Oct 16 16:07 academics_High_School.doc
-rw-rw-r--  1 sachin sachin      648 Oct 16 13:34 academics_pre_primary.doc
-rw-rw-r--  1 sachin sachin      708 Oct 16 13:39 academics_primary.doc
-rwxrwxr-x  1 sachin sachin     8816 Nov  1 12:10 a.out
-rw-rw-r--  1 sachin sachin    23956 Oct 23 18:14 Ass1.c++
-rw-rw-r--  1 sachin sachin      342 Oct 23 22:13 Ass2.doc
drwxrwxr-x  2 sachin sachin     4096 Oct 19 10:45 Backtracking
drwxrwxr-x  3 sachin sachin     4096 Sep 23 20:09 BeautifulSoup
drwxrwxr-x  2 sachin sachin     4096 Nov  2 00:18 CL_1
drwxrwxr-x  2 sachin sachin     4096 Oct 23 20:16 Code
drwxr-xr-x  2 sachin sachin     4096 Nov 15 12:05 Desktop
-rw-rw-r--  1 sachin sachin        0 Oct 13 23:12 doc
drwxr-xr-x  4 sachin sachin     4096 Nov  6 21:18 Documents
drwxr-xr-x 27 sachin sachin    12288 Nov 17 13:23 Downloads
-rw-r--r--  1 sachin sachin     8980 Sep 19 23:58 examples.desktop

1

简洁的解决方案,如果您想重复运行命令直到失败,则特别有用,它可以让您查看所有输出。

while ls -l; do
    sleep 5
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.