cron은 ".bashrc" 및 ".bash_profile"에 정의된 변수를 무시합니다.

cron은 ".bashrc" 및 ".bash_profile"에 정의된 변수를 무시합니다.

/etc/crontab 파일에 "SHELL" 변수를 정의했습니다.

[martin@martin ~]$ grep SHELL /etc/crontab 
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$ 

또한 /etc/crontab 파일의 모든 스크립트는 "martin" 사용자로 시작됩니다. 하지만/home/martin/.bash_profile(로그인 쉘용) 및/홈/마틴/.bashrc(비로깅 쉘의 경우) cron 작업에서는 무시되지만 SSH를 통해 시스템에 로그인하거나 새 bash 세션을 열 때 사용되는 일부 변수가 포함되어 있습니다. cron이 이러한 변수를 무시하는 이유는 무엇입니까? cron은 사용자 "martin"의 권한으로 "/usr/local/bin/bash my-script.sh"를 단순히 실행하지 않습니까?

답변1

작업을 실행하는 사용자의 스크립트 상단이나 작업 시작 부분에서 필요한 파일을 얻을 수 있습니다. "source" 명령이 내장되어 있습니다. 이러한 파일을 편집하여 변경 사항을 로드하는 경우에도 동일한 작업을 수행하게 됩니다.

* * * * * source /home/user/.bash_profile; <command>

또는

#!/bin/bash
source /home/user/.bash_profile

<commands>

답변2

대화형 쉘이 아니기 때문입니다. 일부 터미널을 열 때도 같은 일이 발생합니다.

이 질문을 살펴보십시오..bashrc 파일이란 무엇입니까? |수퍼유저

이:

.bashrc, .bash_profile 및 .environment의 차이점은 무엇입니까? |스택 오버플로

연결이 로그인 셸(또는 아님), 대화형 셸(또는 아님) 또는 둘 다인지 여부에 따라 다른 스크립트가 트리거됩니다.

bashrc를 생성하려면 다음과 같이 변경해야 합니다.

Bash가 비대화식으로 시작되면, 예를 들어 쉘 스크립트를 실행하기 위해 환경에서 BASH_ENV 변수를 찾아 그 값이 나타나면 확장하고, 확장된 값을 파일로 사용하여 읽고 실행하는 이름입니다. Bash는 다음 명령이 실행된 것처럼 동작합니다.

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 

그러나 PATH 변수의 값은 파일 이름을 검색하는 데 사용되지 않습니다.

위에서 언급했듯이 --login이 옵션을 사용하여 비대화형 쉘을 호출하면 Bash는 로그인 쉘 시작 파일에서 명령을 읽고 실행하려고 시도합니다.

원천:Bash 시작 파일 | Bash 참조 매뉴얼 |

답변3

source쉘을 사용하는 경우 sh쉘을 실행하지 못할 수도 있습니다. 이는 crontab에 다음 줄을 추가하여 변경할 수 있습니다.

SHELL=/bin/bash
* * * * * source "/root/.bashrc"; <command>

환경을 지정할 수도 있습니다.

BASH_ENV="/root/.bashrc"
* * * * * <command>

/home/user/.bashrc또는 사용자 크론 작업인 경우 로컬(예 crontab -e: )을 사용할 수 있습니다.

있는 경우 .bash_profile교체할 수 있습니다..bashrc

신용 거래:cron 쉘을 변경하는 방법(sh에서 bash로)?

답변4

.bashrccronjob에서 얻는 내용을 방해할 수 있는 또 다른 사항은 파일이 대화형 쉘을 감지하기 위해 수행하는 검사입니다.

예를 들어 Ubuntu 18.04에서는 .bashrc사용자의 기본값이 다음으로 시작됩니다.

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

따라서 소싱하면 즉시 종료되므로 유용한 작업이 수행되지 않습니다.

관련 정보