如何将`watch`作为后台作业运行?


Answers:


26

目的watch是全屏显示命令结果并连续更新;如果将输出重定向到文件中并使其后台,则实际上没有理由首先使用watch。

如果您想一次又一次地延迟运行命令(watch默认情况下等待两秒钟),则可以使用以下命令:

while true; do
    cmd >> output.txt
    sleep 2
done

有没有办法以一种非阻塞的方式做到这一点?例如,如果我想将此命令和其他命令放在单个bash脚本中,并让它继续运行此之后的代码(同时仍在后台执行此操作)?
奥斯丁

14

这是一种方法:

watch -n 1 'date' &>/dev/null &

由于您已为该过程提供了背景,因此我们可以假设您不需要终端显示,并且可以直接重定向到文件。如果这样做,您将能够watch毫无问题地获得背景。

sleep正如Michael Mrozek所建议的那样,将缓慢地滞后,这可能是不希望的。除了监视系统时间并根据经过的时间执行命令的复杂的shell脚本外,watch -p对于精确计时,它也是一个不错的选择。

对于精确的时间:

watch -n 1 -p 'date' &>/dev/null &

抱歉,这如何运作?为什么只能使用&两次?
phil294

阅读的管道部分man bash以了解第一个的&工作原理。;)
Mioriin

11

我不确定您的动机,但这也许就足够了吗?

while true; do sleep 2; cmd >>output.txt; done &

否则,请解释您为什么真正需要watch


2

tee是你的朋友。例如,下面是显示当前目录中文件数并将其每2秒追加到count.txt的方法:

watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'

2

取决于您的动机:

  • 您想定期运行某些内容。然后,您可以直接使用cron。(如果1分钟的时间间隔足以满足您的目的)。

    • 注意:如果间隔很短或设备非常受限制,并且除非您配置syslog以记录来自crond的更少消息,否则它将很快填满syslog。
  • 您只想重复运行一些内容:

    while sleep 2 ; do
      cmd
    done >& log.txt

    (例如,尽管强烈建议使用脚本,但您可以从crontab中运行该脚本)。

  • 您想定期运行命令并有权访问其最后执行的输出。

    • 您可以将输出写入ramfs(之前修改脚本):

      while sleep 2 ; do
        cmd >& last_execution.log
      done 

      甚至更好:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • 您可以将screen和组合在一起watch,以便始终可以查看最新状态,只要它适合一个屏幕即可:

      screen watch -n 3660 ./make-backup.sh


0

如果您必须使用watch-只需合并Mike Dangelol0b0的答案

watch -n 1 'cmd | tee -a output.txt' &>/dev/null &

例如

watch -n 1 'date | tee -a output.txt' &>/dev/null &

然后看几秒钟

tail -f output.txt

0

Watch旨在输出到屏幕,但是可以将其输出重定向(stdout和stderr),然后它将在后台运行。

watch 'date >>fa' >/dev/null 2>/dev/null &
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.