在使用watch命令监视程序完成之前,我通常会从同一个shell运行很多程序。 (我过滤了ps命令,但这个例子比较简单。)
sleep 10 && for i in {1..100}; do echo $i; done &
watch -n 5 ps aux
watch命令清除终端,以便命令输出清晰且没有混乱。
当另一个程序输出例如示例中的echo语句时,结果有点奇怪。它打印奇怪,结果似乎取决于输出的大小。即使手表应该重新运行" ps aux"命令,它不会覆盖" echo"的输出。命令。
是否有类似的东西阻止其他程序的输出覆盖手表输出?
watch -n 5 ClearScreenSomehow && ps aux
答案 0 :(得分:2)
我不知道是否有简单的方法来执行此操作。在有人想出一个之前,这是一个复杂的方法:
将原始案例视为控制:
#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
,这正是我们在示例中所需要的。在您的实际使用案例中,您必须loop over every pid
running in the background获得给定的shell,并将每个pid
替换为上面的$!
。
另请注意,gdb
调用对于您自己的进程应该没有sudo
,但出于某种原因(源于某些配置),它只允许我使用sudo
执行它。您的里程可能会有所不同。
答案 1 :(得分:1)
简单而明显的答案是不运行可以在没有重定向的情况下生成输出的后台命令。
当您在后台运行某些内容时,请将其打印到文件中。如果要查看输出,请检查文件。
有些人还喜欢使用screen
或tmux
在单独的虚拟终端中运行单独的作业。或者只是在执行其他操作时为要运行的每个进程打开单独的xterm
或类似内容。