![実行してログを保存](https://rvso.com/image/913182/%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%83%AD%E3%82%B0%E3%82%92%E4%BF%9D%E5%AD%98.png)
ループを介して引数のスクリプトを実行し、ログを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
使用します。while
read
#!/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
これは平行です。