在Bash中每秒运行一个命令?

73
我想写一个图片下载器,并在bash中运行。我已经有了以下内容:
  1. 正常工作的命令(类似于wget http://mywebcam.com/image.jpg -O /var/cam/Image.jpg)
  2. root权限

  3. 我的服务器和网络摄像头之间的快速网络连接

我需要实现以下功能:

每秒从摄像头下载一次图像*(sleep 1?)*,并将其覆盖本地文件 (我的命令可以实现) 一次运行此脚本,不需要担心重启问题 (我认为我需要创建一个包含bash命令的文件,并运行它一次+设置crontab定时任务“在重启时”运行此文件,对吗?)

也许有人知道我该怎么做?

http://unix.stackexchange.com/questions/10646/repeat-a-unix-command-every-x-seconds-forever - Ciro Santilli OurBigBook.com
1
请查看我的bash重复函数,它具有精细的时间间隔和持续时间检查。 - F. Hauri - Give Up GitHub
3个回答

145

如果你想每秒运行一次命令(在一个命令结束到下一个命令开始之间有一秒的间隔,这与每秒运行不同),只需要执行以下操作:

while sleep 1; do cmd; done

如果你想让它在重启后启动,方法将取决于你的系统。

请注意,可以每秒运行一次执行,而不是以一秒间隔运行,但我怀疑这实际上不是你想要的。此外,这样做存在固有的风险。例如,如果系统变得缓慢,并且命令开始花费超过一秒钟的时间运行,则可能会耗尽资源。


我在我的服务器上使用CentOS。这是将其添加到crontab的正确方法吗? - Egor Sazanovich
我不熟悉CentOS,但cron不是解决方法。相反,尝试向/etc/rc.local添加一行。 - William Pursell
我使用了这个方法来修复我的Virtualbox Linux虚拟机中的文件系统错误,该虚拟机使用我的Windows的D:\www\作为其Apache根目录。 - Henry van Megen
通常我会对每秒钟执行某些操作感到不安,但这是正确的方法。如果您使用任何实际每秒运行它的方法,您将遇到不断增长的资源问题。假设该命令需要1-2秒才能运行。每秒钟,您都会生成一个运行1-2秒的进程。随着这些进程的不断增长,它们将需要更长的时间才能完成,并最终使系统停滞不前。将其放在CentOS的“/etc/init.d/rc.local”中,并确保为“do cmd >/var/log/mything 2>&1”记录日志。 - Marc Young
3
区分输出的另一种方法是添加时间戳:while sleep 1; do date; cmd; done 或者可以加一个横幅:while sleep 1; do echo; echo "**********************"; date; cmd; done - William Pursell
显示剩余2条评论

87

watch 命令可以直接帮你实现这个功能,并以优美的方式显示结果。

$ watch -n 1 date

将您的命令中的date替换为所需内容。 -n选项指定间隔时间(以秒为单位)。


7
完美!如果您使用带管道的命令,只需在其周围加上引号:watch -n 1 "du -hs * | sort -h | grep nodes" - Matthias Dunkel
2
关闭重定向的标题并记录日志,请执行以下命令:watch -t -n 1 "du -hs * | sort -h | grep nodes >> nodes.log" - hobs

1
如果 cron 的一分钟间隔对您来说太长了,您可以利用 systemd 反复重启服务的能力。
[Unit]
Description=Poll something each second

[Service]
Type=simple
ExecStart=/opt/poller/poll.sh
Restart=always
RestartSec=1
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

我知道这是一种混乱而且有点像“永远不要这样做”的方法。但它完美地运作并且设置非常简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接