crontab을 통해 bash 스크립트가 예상대로 작동하지 않습니다.

crontab을 통해 bash 스크립트가 예상대로 작동하지 않습니다.

내가 작업 중인 레거시 시스템은 무엇인지 sun Solaris 10, 특정 생산자를 처리하는 스크립트를 만들었습니다. bash/perl/posix/sqlplus/awk약 1,000개 라인으로 구성되어 있고, 독립 실행형 모드에서는 잘 작동하고, 예상대로 작동하지만, 문제가 있습니다. 스크립트가 작동하지 않습니다. crontab 역할은 StackOverflow/stackunixexchange를 통해 다음과 같은 많은 조언을 따랐습니다.

  1. 체방에서 출발#!/bin/bash
  2. 전체 권한이 있는 스크립트 777
  3. 올바른 crontab 시간 구문
  4. 서비스가 다시 시작되었습니다
  5. 셸 상단에 모든 환경 변수 로드
  6. crontab bash의 스크립트 시작 부분에 bash를 설정하십시오.

내 문제는 해당 스크립트에만 있고 나머지 스크립트는 잘 작동합니다. 아마도 스크립트가 bash에 있어야하고 crontab이 기본적으로 최소한의 환경 변수가로드 된 sh 또는 crontab으로 실행되기 때문일 것입니다.

마지막으로 필요한 쉘을 다른 쉘에 삽입하고 crontab에서 새 쉘을 설정하여 새 쉘을 통해 실행하여 문제를 해결했습니다. 이 단계 후에는 crontab이 제대로 작동하고 스크립트를 실행할 수 있음을 알 수 있지만 문제 스크립트가 예상한 작업을 수행하지 않고 bash statements프로듀서 if statements 와 같은 다른 작업을 건너뛰고 있다는 것입니다. sqlplus/ Perl statements이 문제를 해결하는 방법을 알려주실 수 있나요? 이 문제는 crontab에 스크립트를 예약할 때만 발생합니다.

crontab의 쉘은 다음과 같습니다:

10 10,16 * * 1,4 bash /rate/u01/WORK/MP/ERROR/USAGE_REJECTIONS/HolderUsageShell.sh

스크립트는 다음과 같이 시작됩니다.

#!/bin/bash 
#environment shell contains all environment variables, I have tried to run it with/without and I got the same thing
/rate/environment.sh >/dev/null

cd /rate/path/
CurrentHour=$(date +%I)
DAY_In_Word=$(date +%A)

if [[ "$DAY_In_Word" == "Monday" || "$DAY_In_Word" == "Thursday" ]] && [[ "$CurrentHour" == "10" ]]; then
.
.
.

답변1

서브셸에서는 환경을 변경할 수 없습니다. 서브셸이 종료되면 변경 사항이 손실됩니다. 하위 쉘은 상위 쉘의 환경을 변경할 수 없습니다. 현재 쉘에서 환경을 변경해야 합니다. 스크립트를 다음과 같이 변경합니다.

/rate/environment.sh >/dev/null

~해야 한다

. /rate/environment.sh >/dev/null

관련 정보