Symptoms
- MDRM에서 컴포넌트를 통해 스크립트를 할때 Non-Interactive Shell로 실행된다.
Environment
- MDRM 컴포넌트
Issue
- MDRM 컴포넌트 사용 시, 환경설정 파일을 읽어들이지 못하여 명령어가 실패한다.
- MDRM에서 MCCS cli 명령어 사용시, PATH를 읽어들이지 못하여
command not found
메세지가 출력된다.
- MDRM에서 MCCS cli 명령어 사용시, PATH를 읽어들이지 못하여
- alias 명령어를 인식하지 못한다.
Definition
shell 종류
Login shell
: 로그인시 수행되는 기본 shell
interactive shell
: 사용자로 부터 프롬프트를 통해 직접 명령을 sub-shell을 생성하여 실행
non-interative shell
: 작성한 스크립트 파일을 실행
$ echo $-
himBH
# 'i' 는 interactive 를 의미
Login shell profile 실행 순서
/etc/profile → /etc/profile.d → $HOME/.bash_profile → $HOME/.bashrc → /etc/bashrc
Non-interative shell의 특징
### **Script 실행시에는 alias 기능이 disable 됩니다.**
사용자마다 다른 alias 설정을 가지고 있기 때문에 script 가 배포되어 실행될때 alias 적용이 된다면 오류가 발생할 수 있습니다. ( alias 는 설정할 경우 우선순위가 제일 높습니다. )
### **Script 실행시에는 history 확장이 disable 됩니다.**
history 확장 기능은 interactive shell 에서 사용하기 위한 것으로 script 실행 시에는 기본적으로 disable 됩니다. `history` builtin 명령도 사용할 수 없습니다.
### **Script 실행시에는 job control 이 disable 됩니다.**
job control 도 interactive shell 에서 사용하기 위한 것으로 script 실행 시에는 disable 됩니다. 그렇다고 해서 `&` 메타문자를 이용해 background job 을 생성하지 못한다는건 아니고 다만 bg, fg, suspend 명령을 사용할 수 없습니다. 하지만 jobs, wait, disown 명령들은 사용할 수 있습니다.
### **Script 실행시에는 exec 명령이 실패하면 바로 종료됩니다.**
프롬프트 상에서는 `exec` 명령이 실패하면 에러 메시지와 함께 다음 프롬프트가 뜨게되지만 script 실행시에는 바로 종료하게 됩니다.
### **시작시 실행하는 파일이 다르다.**
Interactive shell 이 시작될때는 `~/.bashrc` 를 실행하고 shell script 나 `bash -c` 로 시작하는 Non-Interactive shell 이 시작될때는 BASH_ENV 변수에 설정된 파일을 실행합니다.
Solution
MDRM workaround
- (방안1) su – {user} -c “{command}”
$ su - oracle -c "/DRscript/oracle_start.sh"
- (방안2) Agent 1.2.10 이상에서만 사용가능
- application.properties 파일에
agent.server.runas_command
옵션추가
- application.properties 파일에
# 기본값
agent.server.runas_command=su - {user} -c {command}