如何在 Bash 中一起使用 watch 和 jobs 命令?

如何在 Bash 中一起使用 watch 和 jobs 命令?

如何使用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

我倾向于使用循环watchgrep完成正在运行的任务,例如

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。

相关内容