Я выполняю скрипт на аргументах через цикл и сохраняю логи в одном файле. Как использовать команду Args для запуска всех за раз. Ниже попробовал args -n -500
Но это не сохраняет журналы. Как добавить сюда сохранение журналов?
решение1
Я думаю, тебе просто нужногруппакоманды внутреннего цикла и перенаправить их вывод в файл, проиндексированный тем же индексом $i
, а затем все вместе отправить в фоновом режиме &
. Что-то вроде
for i in $(cat $file_name)
do
(echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" &
done
Также вместо этого for
и cat
в этом случае я бы использовал while
and 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 &
вместо этого просто &
.
Согласно вышеприведенному сценарию, вероятно, самый простой способ объединить все журналы в один файл — снова использовать цикл (после завершения всех заданий из основного скрипта) следующим образом:
#!/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
Это параллель.