Como eu uso os comandos watch e jobs juntos no Bash?

4

Como eu uso o comando watch com o comando jobs , para que eu possa monitorar quando uma tarefa em segundo plano é concluída?

Eu o executo da seguinte forma, mas não obtenho a saída das tarefas:

watch jobs

Se eu executar trabalhos por conta própria, recebo o seguinte com meu trabalho em segundo plano:

jobs
[1]+  Running                 nohup cat /dev/random >/dev/null &
    
por dabest1 10.08.2012 / 19:59

3 respostas

6

O comando watch está documentado da seguinte forma:

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.

A parte sobre fornecer o comando para sh -c significa que o comando jobs que você está executando via watch está sendo executado em uma sessão de shell diferente daquela que gerou o job, portanto, não pode ser visto outro shell. O problema é fundamentalmente que jobs é um shell embutido e deve ser executado no shell que gerou as tarefas que você deseja ver.

O mais próximo que você pode obter é usar um loop while no shell que gerou o job:

$ while true; do jobs; sleep 10; done

Você pode definir uma função em seu script de inicialização do shell para facilitar o uso:

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

Você só precisa digitar myjobwatch .

    
por 10.08.2012 / 20:19
2

Em vez de um loop, eu costumo usar watch com grep para meu trabalho em execução, por exemplo

watch 'ps u | grep rsync'

Não é perfeito, mas é melhor que um loop while:)

    
por 17.01.2015 / 14:26
1

Você pode usar um loop while e fazer uma função para este comando:

while true; do echo -ne "'jobs'\r"; sleep 1;  done
    
por 10.08.2012 / 20:29