저는 어떤 레거시 시스템으로 작업하고 있는데 sun Solaris 10
, 특정 생산자를 처리하는 스크립트를 만들었고 bash/perl/posix/sqlplus/awk
약 1,000개 라인으로 구성되어 있으며 독립형 모드에서는 잘 작동합니다. 예상대로 작동하지만 crontab에서는 스크립트가 작동하지 않는 문제가 있었습니다. StackOverflow/stackunixexchange를 통해 다음과 같은 많은 제안을 따랐습니다.
- 셰뱅으로 시작하다
#!/bin/bash
- 전체 권한이 있는 스크립트 777
- 올바른 crontab 시간 구문
- 서비스가 다시 시작되었습니다
- 쉘 상단에 모든 환경 변수를 로드했습니다.
- crontab bash의 스크립트 시작 부분에 bash를 설정하십시오.
내 문제는 해당 스크립트에서만 발생하고 나머지 스크립트는 잘 작동합니다. 스크립트가 bash에 있어야 하고 crontab이 기본적으로 sh 또는 crontab 로드 최소 환경 변수를 사용하여 실행되기 때문일 수 있습니다.
마지막으로 필요한 쉘을 다른 쉘에 삽입하고 crontab에서 새 쉘을 설정하여 새 쉘을 통해 실행하여 문제를 해결했습니다. 이 단계 후에는 crontab이 제대로 작동하고 스크립트를 실행할 수 있음을 볼 수 있지만 문제는 스크립트가 예상한 작업을 수행하지 않습니다. 생산자와 같은 다른 작업을 건너뜁니다. / bash statements
이 if statements
문제 를 어떻게 해결할 수 있는지 알려주실 수 있나요? 이 문제는 스크립트를 crontab에 예약할 때만 발생했습니다.sqlplus
Perl 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