在Linux中自动重复命令

Mar*_*ace 296 linux bash ubuntu

是否有可能在linux命令行中每n秒重复一次命令.

例如,假设我有一个导入运行,我正在做

ls -l
Run Code Online (Sandbox Code Playgroud)

检查文件大小是否增加.我想有一个命令让它自动重复.

Raw*_*ode 532

每5秒观看一次......

watch -n 5 ls -l

如果您希望对变更进行直观确认,请--differencesls命令之前附加.

根据OSX手册页,还有

- 累积选项使突出显示"粘性",呈现所有已更改位置的运行显示.-t或--no-title选项将关闭显示显示顶部的间隔,命令和当前时间的标题,以及以下空白行.

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

  • `brew install watch` (9认同)
  • 很好 - 关于它没有将结果附加到命令行 (3认同)
  • 请注意,您需要转义属于您正在观看的命令的特殊字符,例如:`watch mysql dbname -e \"show processlist \; \"` (3认同)

Ole*_*huk 114

while true; do
    sleep 5
    ls -l
done
Run Code Online (Sandbox Code Playgroud)

  • `watch`也有清除屏幕的不幸副作用,所以有时循环很有用.使用哪个取决于所需的输出格式. (9认同)

mik*_*ail 92

"观看"不允许在Busybox中使用一秒钟,而"睡眠"则可以.如果这对您很重要,请尝试以下方法:

while true; do ls -l; sleep .5; done
Run Code Online (Sandbox Code Playgroud)


Seb*_*ner 33

sleep已经回来了0.因此,我正在使用:

while sleep 3 ; do ls -l ; done
Run Code Online (Sandbox Code Playgroud)

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


jon*_*nzh 18

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

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


Ran*_*r T 13

我们可以在没有cron的情况下定期运行命令while.

作为命令:

while true ; do command ; sleep 100 ; done &
[ ex: # while true;  do echo `date` ; sleep 2 ; done & ]
Run Code Online (Sandbox Code Playgroud)

例:

while true
do echo "Hello World"
sleep 100
done &
Run Code Online (Sandbox Code Playgroud)

不要忘记最后一个,&因为它会把你的循环放在后台.但是你需要使用命令"ps -ef | grep your_script"找到进程id,然后你需要杀死它.所以在运行脚本时添加'&'.

# ./while_check.sh &
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
while true; do 
    echo "Hello World" # Substitute this line for whatever command you want.
    sleep 100
done
Run Code Online (Sandbox Code Playgroud)

然后键入来运行它 bash ./while_check.sh &


小智 7

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

watch -n 1 'ps aux | grep php'
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

它可能仍然漂移一点,因为睡眠只精确到一秒钟.您可以通过创造性地使用date命令来提高此准确性.


bri*_*all 5

如果您想做某事特定次数,您可以随时执行以下操作:

repeat 300 do my first command here && sleep 1.5
Run Code Online (Sandbox Code Playgroud)

  • 对于 bash 做 `for x in {1..300} ; 做`命令`||break;sleep 1.5; 完成` (8认同)