실행 및 로그 저장

실행 및 로그 저장

루프를 통해 인수에 대한 스크립트를 실행하고 로그를 하나의 파일에 저장하고 있습니다. 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 를 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 &대신 그냥 &.


위 시나리오에 따르면 모든 로그를 하나의 파일로 병합하는 가장 쉬운 방법은 다음과 같은 방식으로 루프를 다시 사용하는 것입니다(기본 스크립트의 모든 작업이 완료되면).

#!/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

이것은 평행하다.

관련 정보