2012-01-12 14 views
2

私は顧客のサーバのいくつかのデフォルト設定を行うためのスクリプトを書いており、ほぼ100%稼働させています。「yum -y update」の実行中に2秒ごとにエコーを繰り返す方法はありますか?

私が理解できないのは、yum -y updateをどのようなループで実行して "。"をエコーするかです。 2秒ごとに更新されます。ここで

は動作しませんが、私はそれが仕事をするようにするために変更するかわからないという、もう少し

明らか
YUMLOG=/var/log/config.log 
while [ yum -y update > $YUMLOG 2>&1 ] 
do 
    echo "." 
    sleep 2 
done 

を説明するためのコード例です。私はコードに、この 'プログレスバー'の効果を与える他の部分を持っていますが、ループの中には何もありません。たとえば、次のように

if [ $SETXENNET != "y" ]; then 
     sleep 1 
     cp $TEMPLATEDIR/rc.local.template $TEMPLATEDIR/rc.local.new 
     echo "." 
     sleep 1 
     cp $TEMPLATEDIR/rc.local.new /etc/rc.local 
     echo "." 
     sleep 1 
     chmod a+x /etc/rc.local 
     echo "." 
     sleep 1 
    else 
     sleep 1 
     cp $TEMPLATEDIR/rc.local.xen.template $TEMPLATEDIR/rc.local.xen.new 
     echo "." 
     sleep 1 
     cp $TEMPLATEDIR/rc.local.xen.new /etc/rc.local 
     echo "." 
     sleep 1 
     chmod a+x /etc/rc.local 
     echo "." 
     sleep 1 
    fi 

そして、私は人々がすべての「スリープ」のために私を叫んで取得する前に、人々はそれがどのような彼らの任意のアイデアを持っていない実行しているので、私は、スクリプトの進行状況を表示する方法を持っていなければなりませんでした(彼らはちょうどチェックリストからキーストロークを読んで、何かが終わったときにチェックする)。

普通の英語で何が起きているのか(つまり「完了」、「スキップされました」)、そして2)スクリプトがまだ実行中であることを視覚化するために、画面に何も表示されない場合

最後に、進歩を示しているようにグローバルな変更を加えることはできません。すべての変更を行うにはあまりにも多くのコードが必要です。しかし、それが絶対的な唯一の答えであるなら、それは私がやらなければならないことかもしれないと思います...

答えて

7

どうやってこのようになりますか?ドットは、バックグラウンドで実行される関数で印刷されます。 yumが走り終わったら、あなたはそれを殺すことができます。

#!/bin/bash 

function dots { 
    while : ; do 
     echo -n ". " 
     sleep 2s 
    done 
} 

dots & 
pid=$! 

# do real work here 
sleep 15s 

kill -9 $pid 
echo "done!" 
1

このようなことができます。 yumをバックグラウンドで使用し、最初に一時ファイルを作成してから削除してください。メインプロセスはファイルが存在している間にループ、スリープ、プリントを行います。

(touch tmpfile ; yum ... ; rm tmpfile)& 
(while test -e tmpfile ; do echo . ; sleep 2 ; done) 
関連する問題