cd 명령이 포함된 쉘 스크립트를 사용하여 crontab에서 source 명령이 작동하지 않는 이유는 무엇입니까?

cd 명령이 포함된 쉘 스크립트를 사용하여 crontab에서 source 명령이 작동하지 않는 이유는 무엇입니까?

라는 스크립트를 만들었습니다 purging.sh. 나는 이 스크립트에서 명령을 사용하고 cd있으며 스크립트는 디렉토리를 여러 번 변경하므로 cd명령에 일부 변수를 할당하여 디렉토리를 변경하는 데 도움이 됩니다.

cd /home/parthipan/test/wireshark/$a/$b

source ./purging.sh스크립트를 실행하려면 또는 를 사용해야 합니다 . ./purging.sh.

하지만 crontab을 사용하는 스크립트를 정리해야 합니다.

10 01 * * * . /home/parthipan/test/purging.sh

내 스크립트 시작:

#!/bin/bash
a=$( date -d "`date` -60 days" "+%Y%m%d" | cut -b 1-4 )
b=$( date -d "`date` -60 days" "+%Y%m%d" | cut -b 5-6 )
c=$( date -d "`date` -60 days" "+%Y%m%d" | cut -b 7-8 )
cd /home/parthipan/test/wireshark/$a/$b
d=$( ll | awk -F " " '{print $9}' | awk -v value=$c '$1 < value' | sed "/^$/d" | xargs )
echo "The Days archiving are: $d"
e=$( ll | awk -F " " '{print $9}' | awk -v value=$c '$1 < value' | sed "/^$/d" | wc -l )
f=$( date -d "`date` - 61 days" "+%Y%m%d" | cut -b 5-8 )
if (( $e > 0 ))
        then
                tar --no-overwrite-dir -czvf backup_$f.tar.gz $d
                mv backup_$f.tar.gz /home/parthipan/test/logs_backup
                #rm -rf $d
                logger Data has been purged

위 스크립트는 계속 실행되고 명령은 종료됩니다 fi. 일반적으로 cli에서는 작동하지만 crontab에서는 작동하지 않습니다. 메시지가 인쇄되도록 마지막 줄에 logger 명령을 사용했습니다 /var/log.
그러나 메시지 인쇄는 다음과 같습니다.

May  1 00:50:01 parthipan-nadar systemd: Started Session 24 of user root.

그 이후에는 다른 형태의 로깅이 없습니다. 그러나 필요한 로그는 Data has been purged.

답변1

ll스크립트에서 별칭을 사용하는 것처럼 보이기 때문에 쉘에서 가져올 때 작동합니다 . cron에서 실행되는 스크립트에는 사용자 환경이 없으므로 특정 별칭이나 환경 변수에 의존하기보다는 더 명시적으로 설정해야 합니다( 외부 또는 외부에 있는 실행 파일을 PATH호출하는 경우 ). 별칭이 의 별칭 인 경우 해당 별칭을 대신 사용하세요 (아래 항목 1 참조)./bin/usr/binllls -lls -l

기타 의견:

  • ls를 구문 분석하지 마세요. 기간을 기준으로 파일을 필터링해야 하는 경우 stat또는 를 사용하세요 find.

  • 날짜 호출 내에 날짜 호출을 중첩할 필요는 없습니다.-d "60 days ago"

  • 단지 연도, 월, 일을 얻기 위해 date를 6번(!!) 호출하지 마세요.

    read -r year month day < <(date -d "60 days ago" "+%Y %m %d")
    
  • 설명적인 변수 이름을 사용하십시오. a b c...아주 나쁜.

관련 정보