【问题标题】:Clear Screen in "watch" Command在“watch”命令中清除屏幕
【发布时间】:2015-12-01 00:14:20
【问题描述】:

在使用 watch 命令监视程序完成之前,我通常从同一个 shell 运行许多程序。 (我稍微过滤了 ps 命令,但这个例子更简单。)

sleep 10 && for i in {1..100}; do echo $i; done &
watch -n 5 ps aux

watch命令清空终端,使命令输出清晰,没有杂乱。

当另一个程序输出例如示例中的 echo 语句时,结果有点奇怪。它打印得很奇怪,结果似乎取决于输出的大小。即使 watch 应该重新运行“ps aux”命令,它也不会覆盖“echo”命令的输出。

有没有这样的东西会阻止其他程序的输出覆盖手表输出?

watch -n 5 ClearScreenSomehow && ps aux

【问题讨论】:

  • 正如所写,这个问题是不可重现的,所以很难帮助你。您需要添加一个重现不良行为的示例程序。
  • 单独说明,为什么您的二进制文件在 Linux 上具有 exe 扩展名?它没有伤害,但它似乎有点奇怪和不必要。
  • @merlin2011 我更改了命令,以便您可以轻松地在自己的终端上重复该问题。我猜exe的东西只是一种习惯的力量。

标签: linux bash


【解决方案1】:

我不知道是否有一个简单的方法来做到这一点。在有人想出一个之前,这是一种复杂的方法:

将原始案例视为对照:

#delayed print to clutter up watch later
bash -c 'sleep 10; echo ASDF' &
#watch dummy command, observe cluttering
watch -n1 'ls -la |head -25'

我的方法是劫持所有可能弄乱你的窗口的进程,并将它们的输出扔进/dev/null的深渊。

重定向已运行进程的输出的标准方法是using gdb。为了以非交互方式执行此操作,您必须使用 the -batch switch 和要重定向的 pid 的手动规范。结果是

bash -c 'sleep 10; echo ASDF' &
#sudo gdb -p "$!" -batch -ex 'p dup2(open("/dev/null",0),1)' -ex 'p dup2(open("/dev/null",0),2)' -ex 'detach'
gdb -p "$!" -batch -ex 'p dup2(open("/dev/null",0),1)' -ex 'p dup2(open("/dev/null",0),2)' -ex 'detach'
watch -n1 'ls -la |head -25'

其中$! 是最后生成的进程的pid,这正是我们在示例中所需要的。在您的实际用例中,您必须使用给定 shell 的 loop over every pid running in the background,并将每个 pid 替换为上面的 $!

还要注意,gdb 调用应该在没有sudo 的情况下为您自己的进程工作,但由于某种原因(源于某些配置)它只让我使用sudo 执行它。您的里程可能会有所不同。

【讨论】:

    【解决方案2】:

    简单而明显的答案是不要运行可以在没有重定向的情况下产生输出的后台命令。

    当您在后台运行某些内容时,将其打印到文件中。当您希望查看输出时检查文件。

    有些人还喜欢使用screentmux 在单独的虚拟终端中运行单独的作业。或者,为您在执行其他操作时要运行的每个进程打开一个单独的 xterm 或类似名称。

    【讨论】:

    • 通常,如果我允许将某些内容打印到标准输出,那是故意的。也许我会观察输出,看看程序是否超过了之前崩溃的点,然后可以离开它,稍后再回来。其他时候,我没想到的程序会打印错误消息,例如我的 IDE。我想我可以将> /dev/null 附加到所有这些调用中,但这有点乏味。
    猜你喜欢
    • 2011-06-20
    • 2012-10-07
    • 2023-03-11
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多