5

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

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

watch jobs

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

jobs
[1]+  Running                 nohup cat /dev/random >/dev/null &

3 ответа3

6

Команда 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 .

2

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

watch 'ps u | grep rsync'

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

1

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

while true; do echo -ne "`jobs`\r"; sleep 1;  done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .