2016-09-30 8 views
-1

私はbashスクリプトを使って練習していました。この小さなスクリプトは1GBを超えるサイズの読み取り可能なファイルをすべて印刷することになっていました。Bashスクリプトのループが無限に

このように実行すると、明らかに膨大な数の印刷が開始されます。 Ctrl + C/Ctrl + Zを使用してプロセスを終了または中断できませんでした。後でスクリプトの最後に&を追加しましたが、それでもバックグラウンドでは実行されません。

なぜそれが起こるのか考えている人はいますか?

+0

万一、発見プロセスが妨げられない睡眠にあったとしたら?これがLinuxの場合は 'ps aux'をチェックし、それがD状態にあるかどうかを確認してください。たとえば、NFSマウントがあってもサーバーが使用できない場合などです。 – FatalError

+0

私はsshとGUI上でlinuxを実行していますが、スクリプト実行中にpsテーブルにアクセスすることすらできませんでした。プログラムを閉じて再接続しなければならなかった。スクリプト自体は正しく見えますか? – DR29

+0

確認する2番目のセッションを開きます。スクリプトの中には、通常の状況下でハングするものはありません。 – FatalError

答えて

1

端末に印刷するには時間がかかります。プログラムがbashより速く印刷している場合、CTRL + Cを入力すると、すべての出力がすでにパイプラインに追加されているため、役立たないでしょう。 findの途中で停止している可能性がありますが、すでに多くのヒットがあったため、プロセスを終了してもbashはパイプラインにあるものを印刷し続けます。

&を追加すると、端末セッションがまだIOによってバックアップされているために役立ちません。バックグラウンドでプロセスを実行しても、bashはIOを印刷しないことになるわけではありません。

ここには単純なbashスクリプトがあります。これを&で実行しても、1は印刷されます。

while [[ 1 -eq 1 ]] 
do 
    echo 1; sleep 1; 
done 

主なことは、IOをファイルにリダイレクトすることです。

find -------- 2> /dev/null 

これにより、「アクセス権が拒否されました」というエラーが/ dev/nullに取り除かれます。そのスクリプトを通常のユーザーとして実行すると、おそらく多くのエラーが発生します。あなたが戻って陽性ヒットを読んであなたの時間を取ることができるように

find ---------- 1> find.txt 

これは、find.txtに陽性ヒットを配置します。そして一緒に、

find ---------- 2> /dev/null 1> find.txt