【发布时间】:2012-11-15 15:17:20
【问题描述】:
是否可以在 Linux 命令行中每 n 秒重复一次命令?
说,我有一个导入正在运行,我正在做
ls -l
检查文件大小是否在增加。我想要一个命令让这个自动重复。
【问题讨论】:
是否可以在 Linux 命令行中每 n 秒重复一次命令?
说,我有一个导入正在运行,我正在做
ls -l
检查文件大小是否在增加。我想要一个命令让这个自动重复。
【问题讨论】:
每 5 秒观看一次 ...
watch -n 5 ls -l
如果您希望直观地确认更改,请在 ls 命令之前附加 --differences。
根据 OSX 手册页,还有
--cumulative 选项使突出显示“粘性”,呈现一个 运行显示所有已更改的位置。 -t 或 --no-title 选项关闭显示间隔的标题, 命令,显示屏顶部的当前时间,以及 下面的空行。
Linux/Unix 手册页可以找到here
【讨论】:
watch mysql dbname -e \"show processlist\;\"
watch 也可以与多个命令一起使用,用引号和分号分隔,例如:watch -n 5 "ls -l; echo; ps -aux"。讨论见askubuntu.com/q/595927/846840
while true; do
sleep 5
ls -l
done
【讨论】:
watch 也有清除屏幕的不幸副作用,所以有时循环很有用。使用哪种取决于所需的输出格式。
--differences 将它们突出显示(如果您担心终端的重绘)
watch 好。例如,当您想在每次调用中生成随机数时,Watch 不起作用,例如watch -n 1 echo ${RANDOM}。 random 只会被调用一次。
"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 &运行它
【讨论】:
echo $!——这是在后台启动的最后一个子进程的PID。
echo `date` 只是写date 的一种糟糕且有点错误的方式。 (该错误与缺少对 echo 的参数引用有关。)另见 useless use of echo.
手表很好,但会清洁屏幕。
watch -n 1 'ps aux | grep php'
【讨论】:
如果你想避免“漂移”,这意味着你希望命令每 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 命令来提高这种准确性。
【讨论】:
如果你想做某事特定的次数,你总是可以这样做:
repeat 300 do my first command here && sleep 1.5
【讨论】:
for x in {1..300} ; do 命令||break;sleep 1.5; done
您可以运行以下命令并仅过滤大小。如果您的文件名为somefilename,您可以执行以下操作
while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done
众多想法之一。
【讨论】:
要更轻松地减少漂移,请使用:
while :; do sleep 1m & some-command; wait; done
由于 bash 运行循环结构和实际执行 sleep 命令的时间,仍然会有少量的漂移。
提示:':' eval 为 0,即 true。
【讨论】:
一个简洁的解决方案,如果你想重复运行命令直到它失败,它特别有用,并且可以让你看到所有的输出。
while ls -l; do
sleep 5
done
【讨论】:
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
【讨论】: