3つの並列ダウンロードを実行し、いつでもすべてのダウンロードをキャンセルします。

3つの並列ダウンロードを実行し、いつでもすべてのダウンロードをキャンセルします。

以下を実行するbashスクリプトが必要です。

  1. wgetを使用して3つのファイルを同時にダウンロードすると、同時に完了する必要はありません。
  2. 同時に3つのダウンロードをキャンセルできますCTRL+C(完了したダウンロードを除く)。

現在、私はwget -c URL各端末で3つの並列インスタンスを実行しています。ただし、Linuxの再起動後に続行できるように、ユーザー入力がキャンセルされるのを待つスクリプトが必要です。

私のシステムはCygwinがインストールされているWindowsです。

ベストアンサー1

parallelこれを達成するためにGNUを使用できます。 URLを配列に入れて、次wgetを実行しますparallel

#!/bin/bash
urls=( "https://example.com" "https://example1.com" "https://example2.com")

parallel wget -c ::: "${urls[@]}"

Parallelはコマンドを並列に実行し、スクリプトを停止します(たとえば、Ctrl+を使用するとC並列処理が終了し、完了したインスタンスに影響を与えずに実行中の3つのwgetインスタンスがすべて終了します。

parallelオペレーティングシステムリポジトリに見つかる必要があります。


インストールしたくない場合やインストールできない場合は、parallelbashからローカルにインストールすることもできます。

#!/bin/bash

trap 'kill $(jobs -p)' EXIT

urls=( "https://example.com" "https://example1.com" "https://example2.com" )
for url in "${urls[@]}"; do
  wget -c "$url" &
done

wait

ここでの秘密は、trap組み込み関数(help trapbashを参照)を使用して次のことを行います。kill $(jobs -p)EXIT信号コマンド。jobs -p現在のシェルのすべての子プロセスのPIDが返されるため、この場合は実行中のwgetプロセスのPIDになります。これらはkill殺された場所に渡されます。したがって、スクリプトを終了するとサブスクリプトに渡されます。 +killスクリプトを使用してプロセスを終了waitできるように終了する前に、すべてのバックグラウンドジョブの実行が完了するまでスクリプトが待機していることを確認してください。wgetCtrlC

おすすめ記事