pg_dump를 로그 파일인 2개의 다른 psql로 전달하지만 콘솔로는 전달하지 않음

pg_dump를 로그 파일인 2개의 다른 psql로 전달하지만 콘솔로는 전달하지 않음

pg_dump를 2개의 psql 및 로그 파일에 푸시하려고 하는데 터미널에 노이즈를 추가하고 싶지 않습니다.

이 도구에 대한 수많은 게시물을 작성한 후 tee이 명령에 도달했습니다. 작동하지만 콘솔이 여전히 플러딩되어 있을 뿐입니다.

pg_dump -a -t table-country -p 5432 -U usr db-maint2  2>&1 | tee >(psql -p 5432 -U postgres db-project) >(psql -p 5432 -U postgres db-gp-projet) >"initDB_$(date +%Y%m%d_%H%M).log"

읽었지만 더 나은 해결책을 찾지 못했습니다.

또한 내 명령 후에 pg_dump의 표준 출력이 콘솔에 표시되지만 두 psql의 로그는 로그 파일이 아닌 터미널로만 전송됩니다.

편집: 좋습니다. psql을 로그 파일로 출력하는 방법을 알아냈습니다.

pg_dump -a -t table-country -p 5432 -U usr db-maint2  2>&1 | tee >(psql -p 5432 -U postgres db-project >"initDB_$(date +%Y%m%d_%H%M).log") >(psql -p 5432 -U postgres db-gp-projet >"initDB_$(date +%Y%m%d_%H%M).log") >"initDB_$(date +%Y%m%d_%H%M).log"

실제로 이는 psql 명령 중 하나만 기록하며 -atee를 사용하여 핸들을 추가하더라도 file.log에 psql 출력만 생성됩니다.

N번째 편집: 더 이상 아이디어가 없습니다.

n^+1 편집: 물론, 내 뇌가 마침내 깨어났습니다.

답변1

pg_dump -a -t table-country -p 5432 -U usr db-maint2  2>&1 | tee -a >"${LOGFILE}" >(psql -p 5432 -U postgres db-project >>"${LOGFILE}") >(psql -p 5432 -U postgres db-gp-projet >>"${LOGFILE}") 

왜?

왜냐하면 왼쪽에서 오른쪽으로:

  1. pg_dump표준 출력으로 이동
  2. 2>&1오류 스트림을 표준 출력으로 덤프
  3. |파이프 표준 출력 및 오류
  4. to tee -a, 파이프 내용을 보존하고 여러 명령으로 전달합니다(최소한 추가 옵션을 사용하여 처음 전달할 때).
  5. >"${LOGFILE}"먼저 pg_dump stdout 또는 errout을 기록하고 싶습니다. 다음 구문에 유의하세요. ()파일 이름 주위에 아무 것도 없습니다. 내 스크립트에서 변수를 사용하고 있습니다.
  6. >(psql -p 5432 -U postgres db-project >>"${LOGFILE}")그런 다음 psql 명령으로 첫 번째 COPY(대괄호로 묶인 명령)
  7. >>"${LOGFILE}"이전 줄에서는 psql의 표준 출력을 내 파일에 추가(이중)하는 데 사용했습니다 >. 여기서는 오류가 발생하지 않습니다. 가능합니다.
  8. >(psql -p 5432 -U postgres db-gp-projet >>"${LOGFILE}")그런 다음 두 번째 psql 명령이 제공되어 stdout을 로그 파일에 두 번째로 추가합니다.
  9. 콘솔로의 출력은 없으며 모든 것이 tee에 의해 저장되는 것 같습니다(솔직히 말해서 왜 그런지 모르겠습니다).

일부 사람들이 티와 파이프의 사용 사례를 이해하는 데 도움이 되기를 바랍니다.

편집: 내 마지막 명령은

pg_dump -a -t table-country -p 5432 -U usr db-maint2  2>&1 | tee -a > /dev/null >(psql -p 5432 -U postgres db-project >>"${LOGFILE}") >(psql -p 5432 -U postgres db-gp-projet >>"${LOGFILE}")

로그 파일을 오염시키는 대신 표준 출력을 삭제합니다. 오류 스트림을 로그 파일에 보관하는 것이 좋습니다

pg_dump -a -t table-country -p 5432 -U usr db-maint2  2>"${LOGFILE}" | tee -a > /dev/null >(psql -p 5432 -U postgres db-project >>"${LOGFILE}") >(psql -p 5432 -U postgres db-gp-projet >>"${LOGFILE}")

그러나 아직 테스트하지 않았습니다.

답변2

두 가지 방법으로 리디렉션을 변경하면 이 문제가 해결됩니다. 1) 각 명령의 출력 및 오류 스트림을 리디렉션합니다. 2) 로그 파일을 덮어쓰는 대신 리디렉션 연산자를 추가로 변경합니다.

최종 명령은 다음과 같아야 합니다.

pg_dump -a -t table-country -p 5432 -U usr db-maint2  2>&1 | tee >(psql -p 5432 -U postgres db-project &>> "initDB_$(date +%Y%m%d_%H%M).log") >(psql -p 5432 -U postgres db-gp-projet &>> "initDB_$(date +%Y%m%d_%H%M).log") &>> "initDB_$(date +%Y%m%d_%H%M).log"

명령의 출력은 다음 형식으로 지정되는 명령 pg_dump으로 전달됩니다 .tee

tee file1 file2 &>> logfile

이 경우 file1 및 file2 매개변수는 프로세스입니다. tee이전 명령의 출력은 file1, file2에 기록된 다음 표준 출력에 기록됩니다. 표준 출력이 캡처되어 로그 파일로 리디렉션됩니다(추가 모드에서).

file1에 기록된 출력은 psql표준 출력 및 오류에 대한 자체 리디렉션을 설정하는 명령으로 전달됩니다. 두 번째 명령에서도 같은 일이 발생합니다 psql.

로그 파일의 이름은 이 date명령을 사용하여 파생되고 분 단위까지만 정확하므로 로그 파일을 잠재적으로 덮어쓰는 것을 방지하려면 추가가 필요합니다. 또는 출력을 다른 로그 파일로 전달할 수 있습니다.

관련 정보