![db2 명령을 보낼 때 su -c 명령이 실패함](https://linux55.com/image/5495/db2%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EB%B3%B4%EB%82%BC%20%EB%95%8C%20su%20-c%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EC%8B%A4%ED%8C%A8%ED%95%A8.png)
여러 작업을 실행하도록 설정된 스크립트가 있는데 그 중 하나는 데이터베이스에 테이블을 설정한 다음 삭제하는 것입니다(자동 테스트용).
문제는 소수의 사용자만이 이 su - user -c
명령을 사용하고 db2에 대한 호출이 실패한다는 것입니다. 그러나 이상하게도 su - user
db2 명령을 사용하고 실행하면 (스크립트 외부에서) 잘 작동합니다. 이 문제는 스크립트를 한 번 실행한 후 스크립트가 실행되는 동안에만 발생합니다. (비록 어떤 식으로든 변경이 발생하는 것을 볼 수는 없지만 불행히도 정확한 코드를 공유할 수는 없습니다. 예/ 도움이 된다면 재미있을 것입니다. 여기에는 몇 가지 기본 루프와 su - user -c
IBM 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))'"