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

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

当我跑步时:

watch 'cmd >> output.txt' &

该作业被系统暂停:

3569 已停止(tty 输出)

有解决方法吗?

答案1

的目的watch是全屏显示命令的结果并不断更新;如果您将输出重定向到文件并将其置于后台,那么实际上没有理由首先使用 watch 。

如果您只想延迟地一遍又一遍地运行命令(watch默认情况下等待两秒),您可以使用如下所示的命令:

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

答案2

更新,感谢@SDK:

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

tee 非常有用,会将输出推送到指定的文件。

上一个答案:

这是一个方法:

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

由于您将进程置于后台,我们可以假设您不需要终端显示,并且可以很好地重定向到文件。如果您这样做,您将能够watch毫无问题地进入后台。

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

为了精确计时:

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

答案3

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

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

否则,请解释您真正需要的原因watch

答案4

取决于你的动机:

  • 你想定期运行一些东西。然后就可以直接使用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 
      
    • 您可以组合screenwatch,这样您就可以随时查看最新状态,只要它适合一屏即可:

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

相关内容