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

3500
dabest1

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

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

watch jobs 

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

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

3 ответа на вопрос

6
Fran

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

Я добавляю «ясно». `N = 1; пока правда; делать работу; сон $ ; Чисто; сделано; ` sabalaba 8 лет назад 1
2
Ben Hughes

Rather than a loop, I tend to use watch with a grep for my running job, eg

watch 'ps u | grep rsync' 

Not perfect, but better than a while loop :)

1
phschoen

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

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

Похожие вопросы