db2 명령을 보낼 때 su -c 명령이 실패함

db2 명령을 보낼 때 su -c 명령이 실패함

여러 작업을 실행하도록 설정된 스크립트가 있는데 그 중 하나는 데이터베이스에 테이블을 설정한 다음 삭제하는 것입니다(자동 테스트용).

문제는 소수의 사용자만이 이 su - user -c명령을 사용하고 db2에 대한 호출이 실패한다는 것입니다. 그러나 이상하게도 su - userdb2 명령을 사용하고 실행하면 (스크립트 외부에서) 잘 작동합니다. 이 문제는 스크립트를 한 번 실행한 후 스크립트가 실행되는 동안에만 발생합니다. (비록 어떤 식으로든 변경이 발생하는 것을 볼 수는 없지만 불행히도 정확한 코드를 공유할 수는 없습니다. 예/ 도움이 된다면 재미있을 것입니다. 여기에는 몇 가지 기본 루프와 su - user -cIBM mq 명령을 호출하는 일련의 명령만 포함되어 있습니다 .

예를 들어 다음은 실패합니다.

su - user -c "db2 connect to database USER user USING pass; db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'"

실수:

DB21016E The Command Line Processor encountered a system error while sending the command to the backend process.
DB21018E A system error occurred. The command line processor could not continue processing.

그러나 이것은 잘 작동합니다.

su - user
db2 connect to database USER user USING pass
db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'

차이점이 있는지 확인하기 위해 두 경우 모두 env 명령을 출력해 보았지만 예상대로 작동했습니다. 또한 다른 사용자가 실행하는 순서를 조정해 보았지만 그것도 도움이 되지 않는 것 같습니다.

정말 혼란 스럽습니다. 도움을 주시면 대단히 감사하겠습니다.

ksh 쉘을 사용하고 있습니다.

답변1

작동하는 것 같은 해결 방법이 있습니다.

별도의 ksh 스크립트를 생성하고 모든 db2 명령을 실행한 다음(연결을 설정한 다음 테이블을 생성하고 이에 대한 권한을 부여함) 필요한 매개변수를 사용하여 스크립트를 실행했습니다.

이는 -c 부분에도 불구하고 su 인스턴스 내에서 일련의 명령을 실행하여 스크립트 내에서 효과적으로 실행한다는 것을 의미합니다.

답변2

su - user문제는 명령이 사용되고 실행되는 환경이 su - user -c다를 수 있으며 제대로 작동하려면 db2일부 누락된 변수(예: 설정)가 필요하다는 것입니다. DB2INSTANCE출력 비교:

$ su - user
# printenv

그리고

$ su - user -c printenv

그런 다음 다음과 같이 누락된 변수를 간단히 전달할 수 있습니다.

$ su - user -c "export DB2INSTANCE=inst ; db2 connect to database USER user USING pass; db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'"

관련 정보