実行してログを保存

実行してログを保存

ループを介して引数のスクリプトを実行し、ログを1つのファイルに保存しています。一度にすべてを実行するには、Argsコマンドを使用します。以下はargs -n -500を試しました

しかし、これはログを保存しません。ここでログを保存するにはどうすればよいでしょうか?

答え1

ただ、グループ内側のループコマンドを実行し、その出力を同じインデックスのファイルにリダイレクトし$i、バックグラウンドですべてをまとめてプッシュします&。次のようなものです。

for i in $(cat $file_name)
do
    (echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" &
done

またfor、この場合、 and の代わりに、次のようにand をcat使用します。whileread

#!/bin/bash

file_name='in_file'

while IFS= read -r i
do
        (echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" 2>&1 &
done < "$file_name"

ログファイルにエラーメッセージを表示したい場合に備えて、ここに2>&1追加します。構造の詳細については、IFS= read -r lineこちらを参照してください。百科事典的な答え@StéphaneChazelas 提供。

さらに、実行に./script.pl非常に長い時間がかかる場合は、メインスクリプトが開始されたターミナルウィンドウを誤って閉じた場合に備えて、現在のシェルから切り離すことができます。この目的には、次のように使用できます。nohup mycommand &代わりに単に&


上記のシナリオによると、すべてのログを 1 つのファイルにマージする最も簡単な方法は、次のように再度ループを使用することです (メイン スクリプトのすべてのジョブが終了したら)。

#!/bin/bash

file_name='in_file'
merged_log='out_file'

>"$merged_log"   # empty the merged log file - not mandatory if the file doesn't exist

while IFS= read -r i
do
        cat "${file_save}-${i}" >> "$merged_log"
        rm "${file_save}-${i}"
done < "$file_name"

これも動作するはずです:

#!/bin/bash

file_name='in_file'
merged_log='out_file'

while IFS= read -r i
do
        cat "${file_save}-${i}"
        rm "${file_save}-${i}"
done < "$file_name" > "$merged_log"

答え2

書き込み順序が重要でない場合は、

for i in $(cat $file_name);do echo $i; ./script.pl $i>>file & done

これは平行です。

関連情報