Linux 中自动重复命令

问题描述 投票:0回答:14

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

假设我正在运行一个导入,并且我正在做

ls -l

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

linux bash ubuntu
14个回答
600
投票

每 5 秒观看一次...

watch -n 5 ls -l

如果您希望对更改进行视觉确认,请在

--differences
命令之前附加
ls

根据 OSX 手册页,还有

--cumulative 选项使突出显示“粘性”,呈现 运行显示所有已更改的位置。 -t 或 --no-title 选项关闭显示间隔的标题, 命令、显示屏顶部的当前时间以及 接下来是空行。

Linux/Unix 手册页可以在 here

找到

141
投票
while true; do
    sleep 5
    ls -l
done

105
投票

“watch”在 Busybox 中不允许出现零点几秒,而“sleep”则允许。如果这对您很重要,请尝试以下操作:

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

51
投票

sleep
已经返回
0
。因此,我正在使用:

while sleep 3 ; do ls -l ; done

这比 mikhail 的解决方案短一点。一个小缺点是它在第一次运行目标命令之前会休眠。


21
投票

如果命令中包含管道、引号等特殊字符,则需要用引号填充命令。例如,要重复

ls -l | grep "txt"
,watch 命令应为:

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


16
投票

当我们使用

while
时,可以在没有 cron 的情况下定期运行命令。

作为命令:

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 &

运行它

9
投票

手表很好,但会清洁屏幕。

watch -n 1 'ps aux | grep php'

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

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


4
投票

您可以运行以下命令并仅过滤大小。如果您的文件名为

somefilename
,您可以执行以下操作

while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done

众多想法之一。


4
投票

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

while ls -l; do
    sleep 5
done

2
投票

为了更轻松地减少漂移,请使用:

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

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

提示:':' 的值为 0,即 true。


2
投票
watch -n 5 'ls -l 

每 5 秒后运行

ls -l
命令

输出:-

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

0
投票

我创建了一个 shell 别名,它将每隔 x 秒监视传递给它的命令。命令可以是单独的参数或用分号分隔。

# execute commands at a specified interval of seconds
function watch.command {
  # USAGE: watch.commands [seconds] [commands...]
  # EXAMPLE: watch.command 5 date
  # EXAMPLE: watch.command 5 date echo 'ls -l' echo 'ps | grep "kubectl\\\|node\\\|npm\\\|puma"'
  # EXAMPLE: watch.command 5 'date; echo; ls -l; echo; ps | grep "kubectl\\\|node\\\|npm\\\|puma"' echo date 'echo; ls -1'
  local cmds=()
  for arg in "${@:2}"; do
    echo $arg | sed 's/; /;/g' | tr \; \\n | while read cmd; do
      cmds+=($cmd)
    done
  done
  while true; do
    clear
    for cmd in $cmds; do
      eval $cmd
    done
    sleep $1
  done
}

https://gist.github.com/Gerst20051/99c1cf570a2d0d59f09339a806732fd3


0
投票

您可以在一定秒数后停止该命令吗?

© www.soinside.com 2019 - 2024. All rights reserved.