Выполнить и сохранить журнал

Выполнить и сохранить журнал

Я выполняю скрипт на аргументах через цикл и сохраняю логи в одном файле. Как использовать команду 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в этом случае я бы использовал whileand 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

Это параллель.

Связанный контент