シェルスクリプトが一行にとどまることを防ぐ

シェルスクリプトが一行にとどまることを防ぐ

リモートサーバーのディスク使用率を計算するのに役立つシェルスクリプトを作成しましたdf -h。以下にコードスニペットを含めます。

s_arch_1_per=`sshpass -p 'password' ssh root@server_ip_1 "df -h | grep '/Archive_1'| awk '{print $ (NF-1)}'"`

master_per=`sshpass -p 'password' ssh nidhal@server_ip_2 "df -h | grep '/dev/mapper/centos-root'| awk '{print $ (NF-1)}'"`

arch_5_per=`df -h | grep '/archive_1'| awk '{print $ (NF-1)}'`

df -h問題は、時々、破損したマウントポイントが原因でローカルまたはリモートシステムの実行が中断され、シェル全体が完全に実行されないことです。私のスクリプトがdf -hこれらのシステムの1つで動作しないときに行がかかるのを防ぐにはどうすればよいですか?行を実行するのに時間がかかりすぎる場合は、スクリプトが1行をスキップして次の行に進むようにしたいと思います。

答え1

df出力をパイピングする代わりにgrepdfマウントされたすべてのファイルシステム、レスポンスのないファイルシステム(たとえば、中断されたNFSマウントなど)もクエリします)の代わりに、必要なdf情報をファイルシステムに引数として提供します。

たとえば、次のようになります。

df -h | grep '/Archive_1

使用:

df -h /Archive_1

マウントポイントに関する情報をdf入手してください。/Archive_1デバイスノードまたはマウントポイントをパラメータとして使用できます。

GNU dfを使用すると、必要な--outputものがサイズだけであればそのオプションを使用することもできます。 ) df はヘッダヘッダ出力オプションを抑制しません)。例えば

df -h --output=size /Archive_1 | sed 1d

また、バックティックを使用しないでください。コマンドの置き換え。それらは廃止され、廃止されます。代わりに使用してください$()

全体的に見ると、次のようになります。

s_arch_1_per=$(sshpass -p 'password' ssh root@server_ip_1 \
                 'df -h --output=size /Archive_1 | sed 1d')

最後に、パスワード認証の代わりにキーベースのSSH認証を使用する必要があります。しかし、それは別の質問に対する答えです。


$ただし、まだawkを使用したい場合、または必要に応じて、フィールド番号の前にあるすべての記号を次のようにエスケープする必要があります。\$ 二重引用符内にある場合\$(NF-1)たとえば$(NF-1)

シェルの引用はPITAです。特に、複数のレベルの引用を実行する必要がある場合(たとえば、SSHを介して引用したawkスクリプトをリモートホストに送信する場合など)。

バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?シェルの引用に関する様々な有用な情報とヒント。

関連情報