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

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

저는 어떤 레거시 시스템으로 작업하고 있는데 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 statementsif statements 문제 를 어떻게 해결할 수 있는지 알려주실 수 있나요? 이 문제는 스크립트를 crontab에 예약할 때만 발생했습니다.sqlplusPerl statements

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

관련 정보