1つのディレクトリ内のすべてのスクリプトを同時に実行したいと思います。
すべてのスクリプトのリストを取得し、「ls ./*.sh」を使用してディレクトリの最初のスクリプトを実行できることを知っていますが、すべて実行することはできないようです。
また、中かっこ拡張{./*.sh;を試しましたが、最初のスクリプトのみを実行しました。
これらすべてを実行する方法を見つけたら、すべてバックグラウンドで実行したいと思います。
forループを使用してこれを行うことができることを知っていますが、単にタスクを実行するワイルドカードまたは中括弧拡張を使用する単純なライナーがあることを願っています。
どうすればいいですか?
答え1
for script in ./*.sh; do "$script" & done
wait
または、GNUを使用して同時呼び出しの数を制限しますxargs
。
xargs -n1 -P5 -r0a <(printf '%s\0' ./*.sh) env
(スクリプト名に=
文字が含まれていないとします。)
または以下を使用してzsh
:
autoload zargs # best in ~/.zshrc
zargs -n1 -P5 ./*.sh -- command
(ここでは最大5個)
これらのスクリプトが出力を生成すると、深刻なインターリーブが発生する可能性があります。 GNUは、parallel
各コマンドの出力を別々の一時ファイルに保存し、順次出力してこの問題を解決します。
parallel -j0 exec ::: ./*.sh
(-j0
これらすべてを並列に実行するには、CPUコア数の制限を削除するか、直接数値を指定してください)。
答え2
フォルダを次のコマンドに渡して、フォルダ内のすべてのスクリプトを実行できますrun-parts
。
run-parts /path/to/folder &
答え3
バックグラウンドで各シェルスクリプトを実行します。
sh -x script1.sh & sh -x script2.sh & sh -x script3.sh &
現在のコマンドが完了するのを待たずに次のコマンドを実行できるように、各スクリプトをバックグラウンドモードで実行します。
'&'はスクリプトがバックグラウンドで実行されるようにし、プロンプトが完了するのを待たないようにします。
答え4
バックグラウンドでスクリプトを実行します。
./myscript.sh & ./myscript2.sh & ....