当我跑步时:
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
您可以组合
screen
和watch
,这样您就可以随时查看最新状态,只要它适合一屏即可:screen watch -n 3660 ./make-backup.sh