Bash에서 파일 설명자를 만들고 파일을 가리키며 여기에 일부 데이터를 넣으면 다음과 같습니다.
exec 5>>file
for i in {1..10000}; do
echo "$i" >&5
done
파일 설명자 5는 열린 "파일"을 보유하고 있으며 해당 설명자에 데이터를 쓸 때마다 데이터를 추가하고 파일의 현재 위치를 유지합니다.
동일한 설명자를 동일한 파일로 다시 리디렉션하는 경우:
exec 5>>file
현재 fd를 닫고 동일한 파일을 가리키는 새 fd를 다시 생성합니까? 그러면 다음에 데이터를 쓸 때 먼저 파일의 끝을 찾은 다음 끝에 추가해야 합니까? 아니면 설명자가 이미 파일을 가리키고 있고 아무것도 하지 않는다는 것을 인식할 만큼 똑똑합니까? 레벨이 낮아서 무슨 일이 일어나고 있나요?
편집: 더 구체적으로 말하면 파일 설명자를 사용하여 파일을 열어두기 위해 파일에 데이터를 기록합니다. 관련 비트:
recv_udp () { # Receives a udp stream, timestamps and removes commas and the period from the seconds field, deletes blank lines.
socat -L "$LOCKFILE" -u udp-recv:"$UDP_IN",reuseaddr STDIO | ts '%Y %j %H %M %.S' | sed -u -e 's/,/ /g' -e 's/\./ /' -e '/^$/d' &
}
file_handle () { # Points file descriptor 9 to the desired log file
exec 9>>"$DATADIR"/"$CRUISEID"/"$STAMP"/"$STAMP"_"$JDY"_raw
}
parse_lci90i () { # Parse lci90i winch controller mtnw2 data stream.
echo "Started $STAMP $CRUISEID $(date +'%c')" >> "$LOGFILE"
while read YR JDY HR MIN SEC uS GARBAGE GARBAGE TENS SPD LINE CHKSUM; do
printf '%4.0f %03.0f %02.0f %02.0f %02.0f %.3s %s %.0f %.1f %.0f\n' "$YR" "$JDY" "$HR" "$MIN" "$SEC" "$uS" "$STAMP" "$SPD" "$LINE" "$TENS"
check_path
file_handle
printf '%4.0f %03.0f %02.0f %02.0f %02.0f %.3s %s %.0f %.1f %.0f\n' "$YR" "$JDY" "$HR" "$MIN" "$SEC" "$uS" "$STAMP" "$SPD" "$LINE" "$TENS" >&9
done
}
Socat은 20hz udp 피드를 읽고 프로세스 교체를 통해 파서로 펌핑합니다. 여기서는 데이터 행을 읽을 때마다 파일 설명자가 다시 생성되는 것을 볼 수 있습니다. 그렇습니다. 파서에서 stdout을 가져와서 >>를 로그 파일에 직접 넣는 것보다 이것이 더 효율적인지 궁금합니다.
지금까지 모든 응답에 감사드립니다. 여러분 모두는 매우 통찰력이 있습니다. 데이터 파일의 파일 이름에는 데이터 타임스탬프의 율리우스력 날짜가 포함되어 있으므로 날짜가 변경될 때마다 로그 파일이 롤오버됩니다.
답변1
bash
표준 파일 설명자 1(출력) 및 2(오류)를 먼저 플러시하여 리디렉션을 처리합니다. 그 외에는 특별한 작업을 수행하지 않고(파일 설명자가 무엇에 사용되는지는 상관하지 않음) 단지 dup2
설정을 호출합니다.새로운파일에 대한 연결입니다.
파일 설명자를 여는 한 파일 설명자를 통해 동일한 파일을 따릅니다.이름을 바꿔라. 그러나 파일 이름이 변경된 후 새 파일 설명자를 열면 이전 파일에 계속 쓰는 대신 새 파일에 쓰게 됩니다. 마찬가지로, 이전 파일에 대한 하위 프로세스 쓰기는 설명자가 닫힐 때까지 계속됩니다.
추가 자료(소스 코드):