web-dev-qa-db-ja.com

Bashでwatchコマンドとjobsコマンドを一緒に使用するにはどうすればよいですか?

watchコマンドをjobsコマンドと一緒に使用して、バックグラウンドジョブがいつ終了したかを監視するにはどうすればよいですか?

次のように実行しますが、ジョブからの出力が得られません。

watch jobs

ジョブを単独で実行すると、テストバックグラウンドジョブで次のようになります。

jobs
[1]+  Running                 Nohup cat /dev/random >/dev/null &
9
dabest1

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と入力するだけです。

11
Fran

ループではなく、実行中のジョブにwatchgrepを使用する傾向があります。

watch 'ps u | grep rsync'

完璧ではありませんが、whileループよりはましです:)

2
Ben Hughes

Whileループを使用して、次のコマンドの関数を作成できます。

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