Как мне использовать команды watch и jobs вместе в Bash?

8

Как использовать watchкоманду с jobsкомандой, чтобы я мог отслеживать, когда фоновое задание завершено?

Я выполняю это следующим образом, но я не получаю вывод от заданий:

watch jobs

Если я запускаю задания сам по себе, с фоновым заданием теста я получаю следующее:

jobs
[1]+  Running                 nohup cat /dev/random >/dev/null &
dabest1
источник

Ответы:

9

Команда 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выполняется в другом сеансе оболочки, чем та, которая породила задание, поэтому ее нельзя увидеть в другой оболочке. По сути, проблема в том, что jobsэто встроенная оболочка, которая должна запускаться в оболочке, которая порождает задания, которые вы хотите видеть.

Самое близкое, что вы можете получить, это использовать цикл while в оболочке, которая породила задание:

$ while true; do jobs; sleep 10; done

Вы можете определить функцию в вашем скрипте запуска оболочки, чтобы упростить ее использование:

myjobwatch() { while true; do jobs; sleep 5; done; }

Тогда вам просто нужно напечатать myjobwatch.

Fran
источник
1
Я добавляю clear. N=1; while true; do jobs; sleep ${N}; clear; done;
Сабалаба
2

Вместо цикла я предпочитаю использовать watchс grepмоим текущим заданием, например ,

watch 'ps u | grep rsync'

Не идеально, но лучше, чем какое-то время :)

Бен Хьюз
источник
1

Вы можете использовать цикл while и создать функцию для этой команды:

while true; do echo -ne "`jobs`\r"; sleep 1;  done
phschoen
источник