マルチタスクのシェルスクリプトの同時実行

コマンドは、次のコマンドを実行する前に終了した場合、通常の状況下で、シェルスクリプトコマンドは、シリアルに実行されます。たとえば、次のコード:

 #!/bin/bash
for i in {1..10};do
echo $i 
done
echo "END"

結果:

1
2
3
4
5
6
7
8
9
10
END

コマンドが逐次実行され、「私は$エコー」ループ内で見ることができます。しかし、コマンドの実行は、全体のプロセスの実行時間につながるれ、長い時間がかかる場合が非常に長く、さらにはプログラムの実行、応答の長期喪失時にそこに立ち往生することがあります。
たとえば、私たちは、このようなタスクを完了する必要があります。現在、オンラインホスト192.168.80.0/24ネットワークをスキャンするスクリプトを記述するために、オンラインと考えてpingを実行することができます。
このタスクを達成するために、スクリプトを書くためには、次のコードが書かれている、複雑ではありません。

 #!/bin/bash
for i in {1..254};do
        ip="192.168.80.$i"
        ping -c 2 $ip &> /dev/null && echo $ip is up 
done

ここでは、スクリプトで使用されるpingコマンドの簡単な説明。pingコマンドでLinuxが継続的に実行した後に収縮するため、スクリプトのpingコマンドは、「-c」オプションを使用して、二回しかパッケージなさを指定し、応答を受信した場合、それはオンラインターゲットホストと考えられています。
このスクリプトは、論理的に、そこには問題ありませんが、254 pingをネットワークのIPアドレスをオンにするため、実行した後、非常に時間がかかりますが、今回はスクリプトのみCtrlキーを使用することができ、終了するには、Ctrl + Cを使用するように強制することはできません背景にZを+して、killコマンドを使用すると、処理を終了します。

 [root@localhost ~]# bash ping.sh
192.168.80.1 is up
192.168.80.2 is up
^C
^Z
[1]+  已停止               bash ping.sh
[root@localhost ~]# jobs -l                             #查看后台工作任务
[1]+ 101100 停止                  bash ping.sh
[root@localhost ~]# kill -9 101100                      #强制结束进程
[root@localhost ~]# 
[1]+  已杀死               bash ping.sh

事実上、そして最後に「ピング192.168.80.1」まで待つとする必要はありませんループの実行中にスクリプトでpingコマンドの間には依存関係は、完全に、これらのpingコマンドのすべてを「のping 192.168.80.2」を実行しませんあなたは、同時に実行することができます。
あなたは、Pythonを使用している場合は、マルチスレッド技術による命令の同時実行を実現することができ、かつシェルが唯一の方法ですることができ、マルチスレッド、マルチプロセスをサポートしていません。コマンドは、「&」と並行して実行されるようにした後、具体的な方法は、つまり、非常に簡単です、あなたが完了した後にコマンドを実行することができるように、それはすぐに次の実行に変わり、その実行の終了を待たずに、背景に撮影されましたコマンド。
ここでは、例、ループechoコマンドのボディの後に追加し、「&」などのコードの前にまだありました:

 #!/bin/bash
for i in {1..10};do
echo $i &
done
echo "END"

結果:

 [root@localhost ~]# bash test.sh
END
[root@localhost ~]# 1
2
3
6
7
4
8
9
10
5

これは、コマンド実行順序の同時実行が保証されていない、とエコーが全体のサイクル「END」コマンドの実装が終了した後、再度実行する必要がありますで、それはプログラムの最初に実行され見ることができます。同時実行は、私たちは多くの場合、ループ本体内のすべてのコマンドが再び後の次のコマンドの後に実行されていることを確認する必要があるときに、あなたはwaitコマンドを使用することができます。マルチスレッドの同期で他の高級言語と同等のシェルのwaitコマンドを使用します。
次に、コードの変更、追加のコマンドを待ちます。

 #!/bin/bash
for i in {1..10};do
echo $i &
done
wait
echo "END"

このようにした結果、正常に:

 [root@localhost ~]# bash test3.sh
6
7
2
3
4
8
9
10
5
1
END

プログラムの同時実行の原則を理解した後、我々はまた、pingのスクリプトを改善します:

 #!/bin/bash
for i in {1..254};do
        ip="192.168.80.$i"
        ping -c 2 $ip &> /dev/null && echo $ip is up &
done
wait

この時点で、スクリプトの実行速度が大幅に強化されます。

 [root@localhost ~]# bash ping.sh
192.168.80.10 is up
192.168.80.20 is up
192.168.80.2 is up
192.168.80.1 is up
192.168.80.135 is up

大幅コードの効率を向上させることができる同時実行の方法により、ループ内にすることができ、実行されるコマンドの間には依存関係が存在しない場合。もちろん、同時実行は、コマンドの並列実行の特に大きな数もこれをすることができ、他のプログラムの動作に影響を与え、システム全体のすべてのリソースを枯渇かもしれません、特に実行されたコマンド・システムのリソースは非常に長い時間を必要とするとき、あること、また欠陥がありますより複雑に、プロセスの同時実行数を制限するための他の技術では、この記事では紹介されません。

おすすめ

転載: blog.51cto.com/yttitan/2409618