원문 : http://www.ischo.net -- 조인상 //시스템 엔지니어

+++++++++++++++++++++++++++++++++++++++++++++++++++++++



shell script를 cron으로 동작시킬때 .bashrc .bash_profile의 변수가 적용되지 않는다



예1) 오라클 sqlplus 를 동작시키는 shell script를 작성하여 테스트 해봤을때 정상동작하는 것을 확인했는데,

        crontab에 등록하여 실행하면 sqlplus가 실행되지 않는다. 


예2)  foobar 유저의 .bash_profile 에  FOOBAR="foobar" 라는 변수를 설정하고

         shell script 작성하여 직접 실행시 FOOBAR 변수의 내용이 잘 보이는데, crontab에 등록하면 FOOBAR 변수값이 미지정으로 나온다.




원인

: .bashrc  .bash_profile 등의 초기화 파일은 interactive mode에서만 실행되기 때문이다.



man bash 내용에서 발췌

       /bin/bash
              The bash executable
       /etc/profile
              The systemwide initialization file, executed for login shells
       ~/.bash_profile
              The personal initialization file, executed for login shells
       ~/.bashrc
              The individual per-interactive-shell startup file
       ~/.bash_logout
              The individual login shell cleanup file, executed when a login shell exits
       ~/.inputrc
              Individual readline initialization file

    


위와 같이 /etc/profile,  ~/.bash_profile, ~/.bashrc  초기화 파일은 login shell 혹은 interactive-shell 에서만 수행되기 때문에

crontab 으로 수행시 초기화파일에 정의한 환경변수는 적용되지 않는다.


shell의 수행환경

     - interactive shell : shell login을 수행하는 환경 (terminal 혹은 ssh remote login)

     - non-interactive shell : shell login을 수행하지 않는 환경 (crontab 실행)




해결방법


1. shell script 안에 초기화파일 수행하는 라인을 추가한다.

#!/bin/bash

 . ~/.bash_profile



2. script의 첫 라인에 bash -login 옵션을 사용한다.  --login 옵션을 사용하면 초기화파일이 모두 수행된다.

#!/bin/bash --login



man bash 내용에서 발췌

       -l        Make bash act as if it had been invoked as a login shell (see INVOCATION below).

       --login
              Equivalent to -l.



3. root 유저를 이용한다.

root 유저의 cron에 등록하여 su 스위치를 -c 옵션과 같이 사용하면 초기화파일이 수행된다.

예)   0 0 * * * su - foobar -c /home/foobar/foobar.sh




(*.118.235.233)