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

Writer : http://www.ischo.net -- ischo // System Engineer in Replubic Of Korea

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

 

원문 : 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




번호 제목 글쓴이 날짜 조회 수
공지 [공지] 게시자료 열람자유. 불펌금지입니다. 조인상 2010.12.07 31070
44 파이프를 이용한 tar와 gzip 동시에 처리하기 ischo 2011.05.19 12113
43 리눅스에서 2TB 이상의 파티션 만들기 ischo 2011.04.11 12296
42 bonding 네트워크 설정 ischo 2011.03.30 15623
41 텍스트파일의 내용을 순차적으로 읽어들이는 스크립트 ischo 2011.03.29 17633
40 불특정 파일리스트 FTP 전송 스크립트 file ischo 2011.02.18 14205
39 시스템 관리자를 위한 50가지 비법 조인상 2011.01.04 12234
38 Linux Performance and Tuning Guidelines - IBM file ischo 2010.11.17 9818
37 HOW TO SELinux file ischo 2010.11.17 9364
36 CentOS에 zabbix 1.8.2 install secret 조인상 2010.07.27 2
35 case로 만드는 오라클 서비스 관리 ksh 스크립트 예제 ischo 2010.06.18 13503
34 리눅스환경에서 RedOwl 정지시키기 조인상 2010.05.27 14552
33 LVM 사용하여 추가한 디스크로 볼륨 늘리기 ischo 2010.05.19 35839
32 vsftpd 포트변경 방법 조인상 2010.05.12 14912
31 파일로 스왑추가 방법 조인상 2010.05.12 11120
30 ssh 자동로그아웃 설정방법 조인상 2010.05.12 41578
29 xinetd 모드로 proftpd 변경 조인상 2010.05.12 12393
28 [펌] 리눅스에서의 시리얼통신 조인상 2010.05.12 20050
27 tar 를 이용한 테잎 백업스크립트 예 조인상 2010.05.12 11015
26 랜카드 동작속도 확인/수정 방법 조인상 2010.05.12 29515
25 sendmail 25번포트 접속이 localhost에서만 허용될때 조인상 2010.05.12 16973
서버에 요청 중입니다. 잠시만 기다려 주십시오...