![실행 및 로그 저장](https://rvso.com/image/913182/%EC%8B%A4%ED%96%89%20%EB%B0%8F%20%EB%A1%9C%EA%B7%B8%20%EC%A0%80%EC%9E%A5.png)
루프를 통해 인수에 대한 스크립트를 실행하고 로그를 하나의 파일에 저장하고 있습니다. 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
사용합니다 .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 &
대신 그냥 &
.
위 시나리오에 따르면 모든 로그를 하나의 파일로 병합하는 가장 쉬운 방법은 다음과 같은 방식으로 루프를 다시 사용하는 것입니다(기본 스크립트의 모든 작업이 완료되면).
#!/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
이것은 평행하다.