MacOS についてのコメントに気付いたばかりで、@akira (と pv) の解決策の方がはるかに良いと思うのですが、私の MacOS の箱に tar を入れて SIGINFO シグナルを送信して、直感を追いかけてみました。おかしなことに、それはうまくいきました :) BSD ライクなシステムを使っているなら、これはうまくいくはずですが、Linux の場合は SIGUSR1 を送る必要があるかもしれませんし、tar
は同じようにはいかないかもしれません。
欠点は、取得しているデータストリームがどのくらいの大きさなのかを知らないと推測されるので、現在のファイルがどのくらいの距離にあるのかを示す出力(標準出力)しか提供してくれないことです。
ですから、別の方法としては、tarを起動して、定期的にSIGINFOsを送信して、どのくらいの距離にあるのかを知りたいときにいつでもそれを送信するという方法があります。どうすればいいのでしょうか?
アドホックで手動のアプローチ
アドホックにステータスをチェックしたい場合は、関連するウィンドウで(Brian Swift が言及したように)control-T
を押すと SIGINFO シグナルが送信されます。これはSIGINFOシグナルを送信してくれます。
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
と実行している場合、bzip2 が tar と一緒にステータスを報告するのを見ることができます:
a folder-with-big-files/big-file.imgload 0.79 cmd: bzip2 13325 running
14 0.27u 1.02s
adding folder-with-big-files/big-file.imgload (17760256 / 32311520)
これは、実行している tar
がスタックしているのか、単に遅いだけなのかをチェックしたい場合にはうまく機能します。この場合、フォーマットの問題についてはあまり気にする必要はないでしょう。
自動化されたアプローチ
時間がかかることはわかっているが、進捗状況の表示のようなものが必要な場合、別のターミナルで tar プロセスを起動して PID を計算し、スクリプトに投入して繰り返しシグナルを送信するという方法もあります。例えば、以下のようなスクリプトレットがあるとします (そして、script.sh PID-to-signal interval-to-signal-at
として起動します):
#!/bin/sh
PID=$1
INTERVAL=$2
SIGNAL=29 # excuse the voodoo, bash gets the translation of SIGINFO,
# sh won't..
kill -0 $PID # invoke a quick check to see if the PID is present AND that
# you can access it..
echo "this process is $$, sending signal $SIGNAL to $PID every $INTERVAL s"
while [$? -eq 0]; do
sleep $INTERVAL;
kill -$SIGNAL $PID; # The kill signalling must be the last statement
# or else the $? conditional test won't work
done
echo "PID $PID no longer accessible, tar finished?"
このように起動すると、tar
のみをターゲットにしているので、以下のような出力が得られます
a folder-with-big-files/tinyfile.1
a folder-with-big-files/tinyfile.2
a folder-with-big-files/tinyfile.3
a folder-with-big-files/bigfile.1
adding folder-with-big-files/bigfile.1 (124612 / 94377241)
adding folder-with-big-files/bigfile.1 (723612 / 94377241)
...
これは、私が認めるように、ちょっときれいなものです。
0x1&
これは認めるよ。)