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

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

ls -l

检查文件大小是否在增加。我想有一个命令,有这个自动重复。


当前回答

我创建了一个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

其他回答

如果你想避免“漂移”,这意味着你想让命令每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命令来提高这种准确性。

当我们使用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 &来运行它

如果你想把某件事重复几次,你可以这样做:

repeat 300 do my first command here && sleep 1.5

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

查看-n 5 'ls -l | grep "txt"'

在Busybox中,“watch”一秒都不允许,而“sleep”一秒允许。如果这对你来说很重要,试试这个:

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