저는 AIX에서 DB2를 사용하는 데이터베이스 관리자입니다. (이 내용은 DB2와 관련이 없고 ksh와 관련이 있으므로 계속 읽으십시오. 그렇지 않으면 다음에 게시하겠습니다.dba.stackexchange.com.) 저는 데이터베이스 유지 관리 스크립트뿐만 아니라 여러 데이터베이스 배포를 위한 ksh 스크립트를 작성하려고 합니다.
심각한 오류가 필요한지, 경고 메시지만 필요한지, 아니면 무시할 수 있는지 이해하기 위해 스크립트에 오류 처리 기능을 추가했습니다.
대부분의 AIX/ksh 관련 작업에 대해서는 확인할 수 있지만 $? = 0
DB2에 대해서는 확인할 수 없습니다. 데이터베이스 엔진이 실패하지 않는 한, 나는 0 이외의 어떤 것도 얻지 못할 것입니다. 그러나 DB2는 오류/경고/정보 코드를 콘솔로 다시 전달합니다.
콘솔을 통해 이러한 코드를 얻을 수 있다는 것을 알고 있기 때문에 DB2 특정 명령을 얻기 위해 콘솔에서 무엇이든 캡처하려고 노력해 왔습니다. 이것을 얻은 후에는 스크립트에서 egrep
실패( ) 또는 성공( )이 필요한지 결정하기 위해 정규식을 사용하는 함수로 해당 출력을 보냅니다 . 또한 일부 스크립트는 길거나 여러 다른 스크립트를 호출하기 때문에 스크립트의 모든 출력을 로 파이프하는 경향이 있습니다 . 이렇게 하면 참조 및 스크립트 문제 해결을 위해 실행된 전체 "작업"을 기록할 수 있습니다.exit 1
exit 0
tee
ksh blah.sh 2 > &1 | tee mylog
최근에 저는 스크립트에서 구문 오류를 확실히 잡을 수 있다는 것을 배웠습니다 .
ksh에서 이런 종류의 오류 구문 분석을 처리하는 가장 좋은 방법이 무엇인지 궁금합니다. -v 옵션(명령과 명령 결과를 화면에 다시 재생해야 함)을 사용하여 DB2에 명령을 제공하고 이를 변수에 넣으려고 시도했지만 실제로 명령 출력을 얻지 못했습니다. 화면. 예:
RESULT=$(db2 -v drop table blah)
나는 결국 cat ${RESULT}
위 파이프의 스크린 프린트를 티에 인쇄해야 했고, 그 후에도 여전히 구문 RESULT
분석 기능에 전달해야 했습니다.
내가 시도한 또 다른 방법은 명령 결과를 파일로 파이프하는 것입니다. 예:
db2 -v drop table blah | tee myResult
이것은 내 프리미엄 티셔츠 화면에 출력되지만 이제 내 파일 시스템에 나중에 정리해야 하는 추가 파일이 있습니다(아무 문제도 없지만 egrep
) cat
. 내 작업이 스크립트에서 충돌 하고 파이프 자체가 이상한 동작을 tee
일으키는 경우(충돌 없이 성공하면 제대로 작동하는 것입니다). 이로 인해 더블 배럴링이 최선의 선택이 아니라고 tee
믿게 되었습니다 .tee
누군가 script
나에게 이 명령을 언급했지만 도움이 되는지 잘 모르겠습니다.
어떤 아이디어나 생각이 있나요? 나는 tee
전체 작업 실행 에 모든 것을 파이프하면서 오류 구문 분석을 위해 특정 명령의 "화면 캡처"를 사용하려는 유일한 사람이 아니라고 가정합니다 .
ksh blah.sh
또한 나는 서브쉘을 호출하기 위해 동일한 쉘(예: vs . ./blah.sh
) 에서 호출하는 대신 서브스크립트를 사용하는 경향이 있습니다 . 내 스크립트에 가장 적합한 것 같습니다. 이것이 답변에 영향을 미치는지 확실하지 않습니다.
경험을 바탕으로 한 안내를 주시면 매우 감사하겠습니다.
답변1
tee
또는 를 사용할 이유가 없습니다 script
. 사실 이후에 오프라인으로 분석하고 싶지 않다면 말이죠.
script
typescript
기본적으로 반드시 그런 것은 아니지만 셸 세션의 텍스트 출력이 캡처되어 파일에 저장됩니다. 추가 또는 덮어쓰기는 귀하에게 달려 있습니다.
tee
실행 중인 명령의 출력을 파일로 덤프하고 화면에도 표시할 수 있습니다.
내 개인적인 취향은 다음과 같습니다.
<command> 2>&1 > <filename>
나중에 분석할 수 있는 트랜잭션 로그가 필요한 경우. 런타임에 분석 해야 한다면 command
출력을 파일로 덤프하는 것이 더 현명할 것입니다.
<command> | <script> 2>&1 > <filename>
이렇게 하면 스크립트가 출력을 선택적으로 또는 완전히 파일에 덤프하고 알림(이메일, SMS, 페이징, 소프트웨어 알림 모니터링)과 같은 다른 작업을 중지하지 않고 수행할 수 있습니다 command
.
지금 파일에서 무슨 일이 일어나고 있는지 보려면 작업을 백그라운드에 두세요.
<command> 2>&1 > <filename> &
그리고 꼬리
tail -f <filename>
출력은 메시지 코드가 아니라 텍스트라고 가정합니다.