bash를 통해 일부 기능을 구현하기 위해 Centos 6에서 파이프를 사용하고 있습니다. 이러한 파이프라인에서는 데이터를 로그 파일로 내보내고 싶지만 이 데이터는 파이프라인의 다른 파이프에서 제공되므로 각 로그 줄 앞에 태그를 삽입하여 구분하려고 합니다. 보다 정확하게는 다음을 수행하고 싶습니다.
COMMAND1 | (create a line in the log file like: "command1: " + output of the command) | COMMAND2 ...
많은 연구 끝에 나는 다음과 같은 관점에 도달했습니다.
COMMAND1 | tee >(ifne echo -n "command1: " >> out.log) | tee -a out.log | COMMAND2
이것은 작동하지만 문제가 있습니다. 두 번째 파일이 tee
먼저 파일에 쓴 다음 첫 번째 파일에 씁니다 tee
. 그래서 나는 다음을 얻습니다:
(output of command 1)
command1:
바꾸다
command1: (output of command 1)
ifne
나는 두 번째가 tee
첫 번째보다 먼저 실행되기에는 지연이 충분하다고 생각합니다 . 제거하면 ifne
잘 작동됩니다. 문제는 ifne
종종 유휴 출력이 있고 이를 기록하고 싶지 않기 때문에 그렇게 해야 한다는 것입니다.
두 번째 티가 첫 번째 티가 끝날 때까지 기다리게 하는 방법은 무엇입니까?
답변1
내가 올바르게 이해했다면 COMMAND1에서 왔다는 것을 나타내는 태그를 사용하여 COMMAND1의 출력을 기록하려고 합니다. 한 가지 방법은 다음과 같습니다.
COMMAND1 | tee >(sed 's/^/command1: /' >>out.log) | COMMAND2
알아채다:
- 이렇게 하면
command1:
첫 번째 줄뿐만 아니라 각 줄의 시작 부분에 태그가 추가됩니다. 이는 바람직하다고 생각하지만 원하는 작업은 아닙니다. command1
sed 특수 문자를 포함하면 안 됩니다. 그렇지 않으면 백슬래시로 보호해야 합니다.- 추가용으로 열려 있으므로
out.log
동일한 로그 파일에 여러 명령을 병렬로 출력하더라도 출력이 중복될 위험이 없습니다. out.log
이 조각에서는 한 번만 열리므로 모든 행이 순서대로 표시됩니다 .나쁜 소식은 동일한 파일에 여러 번 병렬로 로그인하는 경우 해당 줄이 원하는 순서로 나타날 것이라는 보장이 없다는 것입니다. 예를 들어,
echo hello | tee >(sed 's/^/command1: /' >>out.log) | tr a-z A-Z | tee >(sed 's/^/command2: /' >>out.log)
command2: HELLO
이전에 로그인되었을 수 있습니다command1: HELLO
.- 동일한 파일에 여러 번 병렬로 로그인하고 줄이 너무 길면 다른 인스턴스의 줄이 분산될 수 있습니다. 일반적인 sed 구현은 다음보다 덜 통과할 것이라고 생각합니다.
PIPE_BUF
바이트 길이이지만 확실하지 않습니다.
순서 및 원자성 제한이 있으므로 별도의 파일에 기록하는 것이 좋습니다. 이 경우 접두사가 필요하지 않습니다.