如何使用watch
命令jobs
来监视后台作业何时完成?
我按如下方式执行它,但没有得到作业的输出:
watch jobs
如果我单独运行作业,我将通过测试后台作业获得以下结果:
jobs
[1]+ Running nohup cat /dev/random >/dev/null &
答案1
该watch
命令记录如下:
SYNOPSIS
watch [-dhvt] [-n <seconds>] [--differences[=cumulative]] [--help]
[--interval=<sec-onds>] [--no-title] [--version] <command>
[...]
NOTE
Note that command is given to "sh -c" which means that you may need to
use extra quoting to get the desired effect.
关于将命令发送给的部分sh -c
意味着jobs
您正在运行的命令watch
在与生成作业的 shell 会话不同的 shell 会话中运行,因此无法看到其他 shell。问题从根本上讲是jobs
内置的 shell,必须在生成您想要查看的作业的 shell 中运行。
最接近的做法是在生成该作业的 shell 中使用 while 循环:
$ while true; do jobs; sleep 10; done
您可以在 shell 启动脚本中定义一个函数以使其更易于使用:
myjobwatch() { while true; do jobs; sleep 5; done; }
然后你只需要输入myjobwatch
。
答案2
我倾向于使用循环watch
来grep
完成正在运行的任务,例如
watch 'ps u | grep rsync'
虽然不完美,但是比 while 循环要好 :)
答案3
您可以使用 while 循环并为此命令创建一个函数:
while true; do echo -ne "`jobs`\r"; sleep 1; done
答案4
我可以用
watch 'ps -aef | grep 23774'
其中的数字23774
是同一会话中我的作业的进程 ID。