watch
コマンドをjobs
コマンドと一緒に使用して、バックグラウンドジョブがいつ終了したかを監視するにはどうすればよいですか?
次のように実行しますが、ジョブからの出力が得られません。
watch jobs
ジョブを単独で実行すると、テストバックグラウンドジョブで次のようになります。
jobs
[1]+ Running Nohup cat /dev/random >/dev/null &
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
と入力するだけです。
ループではなく、実行中のジョブにwatch
とgrep
を使用する傾向があります。
watch 'ps u | grep rsync'
完璧ではありませんが、whileループよりはましです:)
Whileループを使用して、次のコマンドの関数を作成できます。
while true; do echo -ne "`jobs`\r"; sleep 1; done