当前位置: 首页>>技术问答>>正文


在Linux中,自动重复命令

, ,

问题描述

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

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

ls -l

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

最佳解决思路

每5秒观看一次……

watch -n 5 ls -l

如果您希望直观地确认更改,请在ls命令之前附加--differences

根据OSX手册页,还有

The –cumulative option makes highlighting “sticky”, presenting a running display of all positions that have ever changed. The -t or –no-title option turns off the header showing the interval, command, and current time at the top of the display, as well as the following blank line.

Linux /Unix手册页可以找到here

次佳解决思路

while true; do
    sleep 5
    ls -l
done

第三种解决思路

“watch”不允许Busybox中的分数秒,而”sleep”则不允许。如果这对您很重要,请尝试以下方法:

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

第四种思路

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

while sleep 3 ; do ls -l ; done

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

第五种思路

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

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

第六种思路

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

第七种思路

watch 很好,但会清洁屏幕。

watch -n 1 'ps aux | grep php'

第八种思路

如果你想避免使用”drifting”,这意味着你想要命令每N秒执行一次,无论命令花了多长时间(假设它花费的时间少于N秒),这里有一些bash将每5秒重复一次命令,并具有one-second精度(和如果无法跟上,会打印出警告):

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命令来提高此准确性。

第九种思路

如果您想要执行特定次数的操作,您可以随时执行此操作:

repeat 300 do my first command here && sleep 1.5

第十种思路

您可以运行以下内容并仅过滤大小。如果您的文件名为somefilename,则可以执行以下操作

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

众多想法之一。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6485.html,未经允许,请勿转载。