쉘을 통해 모니터링하기 위해 psql의 라이브 데이터를 다른 명령으로 파이프하고 싶습니다.
이것이 가능합니까?
지금까지 나는 다음을 가지고 있습니다 :
$ psql bareos -c '\watch (SELECT * FROM log ORDER BY time DESC LIMIT 200) TO STDOUT WITH CSV'
저는 포스트그레스 11.12를 사용하고 있습니다.
그러나 명령을 실행하면 결국 오류가 발생합니다.
\watch cannot be used with an empty query
그러나 psql에서 직접 실행하면 실시간 출력을 완벽하게 볼 수 있습니다.
내 목표는 Unix 스타일의 출력 테일링을 달성하는 것입니다.
답변1
여러 가지 변형을 시도했지만 -c
제대로 작동하지 못했습니다. 충분한 변형을 시도하지 않았거나 \watch
작동하지 않는 것 같습니다 psql -c
.
psql -f
그런 다음 (파일에서 SQL 스크립트 읽기)을 사용해 보았습니다 .프로세스 교체SQL 스크립트 "파일"을 제공하면 제대로 작동합니다.
예를 들어:
psql --csv -f <(printf '%s\n' \
'SELECT * FROM log ORDER BY time DESC LIMIT 200;' \
'\watch')
또는 psql
이 --csv
옵션을 지원하지 않는 경우:
psql -f <(printf '%s\n' \
'\pset format csv' \
'SELECT * FROM log ORDER BY time DESC LIMIT 200;' \
'\watch')
이것은 printf
보낸다둘sql 명령은 개행 문자( )로 구분되어 psql
(먼저 select
, 그 다음 ) 로 전송됩니다 . 이러한 각 명령은 개별적으로 작은따옴표로 묶어야 합니다 .\watch
\n
printf
SQL도 많은 명령에서 작은따옴표를 사용하므로 작은따옴표를 사용하는 SQL 명령을 실행해야 하는 경우 명령을 인용하는 방법에 매우 주의해야 합니다. 예를 들어
psql -f <(printf '%s\n' "select * from table where name='cas'" '\watch 5')
이 예에서는 인용된 문자열과 관련된 문제를 피하기 위해 첫 번째 SQL 명령에 큰따옴표를 사용했습니다 'cas'
. 문제는 셸의 큰따옴표가 변수 보간을 허용하므로 변수 값이 아닌 리터럴 문자열을 원하는 경우 모든 셸 변수 이름(예: \$var
. $var
예를 들어
psql -f <(printf '%s\n' \
"select * from table where pass='\$1\$QsHP.S0S\$1Npjv4aKJZv4IjDD.PgNp/'" \
'\watch 5')
쉘이 변수 이름처럼 보이는 문자열 부분을 확장하는 것을 방지하기 위해 $
각 항목을 a로 이스케이프 처리 해야 했습니다 .\