[Linux] Interactive vs Non-Interactive Shell

Symptoms

  • MDRM에서 컴포넌트를 통해 스크립트를 할때 Non-Interactive Shell로 실행된다.

Environment

  • MDRM 컴포넌트

Issue

  • MDRM 컴포넌트 사용 시, 환경설정 파일을 읽어들이지 못하여 명령어가 실패한다.
    • MDRM에서 MCCS cli 명령어 사용시, PATH를 읽어들이지 못하여 command not found 메세지가 출력된다.
  • 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 옵션추가
# 기본값
agent.server.runas_command=su - {user} -c {command}