【问题标题】:Run command every second in Bash?在 Bash 中每秒运行命令?
【发布时间】:2012-03-07 04:01:38
【问题描述】:

我想编写一些图像下载器并将其分配给 bash。我有什么和我需要什么:

我有:

  1. 命令,效果很好(类似于wget http://mywebcam.com/image.jpg -O /var/cam/Image.jpg
  2. 根权限

  3. 我的服务器和我的网络摄像头之间的快速互联网线路

我需要什么:

每秒从相机下载图像*(睡眠 1?)* 并在本地重写它(我的命令做得很好) 立即运行这个脚本,不用担心重启(我想我需要使用 bash 命令创建文件并运行一次 + 将 crontab 设置为“重启”到这个文件,对吧?)

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

【问题讨论】:

标签: bash loops


【解决方案1】:

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

while sleep 1; do cmd; done

如果您希望它在重新启动时启动,方法将取决于您的系统。

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

【讨论】:

  • 我的服务器上有 CentOS。这是将其添加到 crontab 的正确方法吗?
  • 我不熟悉 CentOS,但 cron 不是要走的路。相反,尝试在 /etc/rc.local 中添加一行
  • 我用它来修复我的 Virtualbox Linux VM 的文件系统错误,它使用我的 Windows 的 D:\www\ 作为 Apache 根文件夹。
  • 通常我一想到每秒都在做某事就会畏缩,但这是正确的方法。如果您使用任何实际每秒运行一次的方法,您将遇到日益严重的资源问题。假设命令需要 1-2 秒才能运行。每一秒你都会产生一个运行 1-2 秒的进程。随着它们的不断增长,它们将需要更长的时间才能完成,最终您最终会使系统停止爬行。把这个放在 /etc/init.d/rc.local 中,确保你把日志放在 do cmd >/var/log/mything 2>&1
  • 另一种区分输出的方法是简单地添加时间戳:while sleep 1; do date; cmd; done 或者可能是横幅:while sleep 1; do echo; echo "**********************"; date; cmd; done
【解决方案2】:

命令watch 将直接为您执行此操作。它还以一种很好的方式显示结果。

$ watch -n 1 date

date 代替你的命令。 -n 选项以秒为单位指定时间间隔。

【讨论】:

  • 完美!如果您使用带有管道的命令,只需在其周围加上引号:watch -n 1 "du -hs * | sort -h | grep nodes"
  • 并关闭标头以重定向到日志watch -t -n 1 "du -hs * | sort -h | grep nodes >> nodes.log"
【解决方案3】:

为此加上我的两分钱...如果 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

我知道这是一种混乱且“永远不要这样做”的方法。但它工作得很好,而且设置起来相当简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2011-05-14
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多