cronjob으로 실행할 때 스크립트가 예상대로 작동하지 않습니다.

cronjob으로 실행할 때 스크립트가 예상대로 작동하지 않습니다.

먼저 일일 백업 파일의 파일 이름 예는 다음과 같습니다.

website-db-backup06-June-2020.tar.gz

아래 스크립트는 터미널을 통해 수동으로 실행할 때 제대로 실행됩니다. 그러나 cron을 통해 스크립트가 실행되면 이메일로 다음 cron 데몬 메시지를 받습니다.

tar: website-db-backup*: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

매주 모든 일일 백업을 압축하는 스크립트는 다음과 같습니다.

#!/bin/bash
#
# Weekly compression for database backups
BACKUP_PATH=~/backup/web/database
BACKUP_FILE_DATE=`date '+%d-%B-%Y'`
tar -czf $BACKUP_PATH/website-db-weekly-compress$BACKUP_FILE_DATE.tar.gz \
    -C $BACKUP_PATH/ website-db-backup* && rm $BACKUP_PATH/website-db-backup*

일일 백업에는 파일 이름이 있으므로 스크립트에서 사용해야 date합니다 . *이것이 이유일까요?

답변1

문제는 스크립트의 현재 작업 디렉터리입니다. website-db-backup*경로가 없으므로 현재 디렉터리에서 실행됩니다. 스크립트에 다음을 추가해야 합니다.

SOURCE_DIR_PATH='/path/to/backup_source'
cd "$SOURCE_DIR_PATH" || exit 1

또한 다음을 실행하기 전에 일치하는 파일이 있는지 확인해야 합니다 tar.

shopt -s nullglob
set -- website-db-backup*
test $# -eq 0 && { echo 'ERROR: No matching files; aborting'; exit 1; }

이 경우 문제가 되지 않을 수도 있지만 danielleontiev가 주석에서 지적했듯이 ~해당 스크립트가 다른 사용자에 의해 실행될 수 있다면 스크립트에서 사용하는 것은 위험합니다. 예상 경로로 바꾸는 것이 좋습니다.

답변2

전역 확장이 실패 하면 failglob전체 명령이 실패하게 됩니다(아무 작업도 수행하지 않음). 쉘의 무작동 연산자 :(콜론)와 결합하면 glob의 결과(성공 또는 실패)를 테스트하는 완벽한 방법입니다.

shopt -s failglob
: website-db-backup*

# The following code is purely indicative
if [ $? -eq 0 ]; then
  echo "Success, website-db-backup* exists"
else
  echo "Failed, nothing matches website-db-backup*"
fi

이것보다 낫다호크 라킨의 답변내부에$1기존 위치 매개변수( 등) 를 파괴하지 않습니다 ., 하지만 다음 함수를 사용하여 이 문제를 해결할 수 있습니다.

shopt -s nullglob

argc() {
  return $#
}
argc website-db-backup*

# Now check $? the same way as above
# $1, $2, ... remain untouched

Bash 배열도 좋은 선택입니다.

shopt -s nullglob
FILES=(website-db-backup*)
echo "${#FILES[@]}"  # gives number of matched files

내 생각에는 이것이 가장 간단하고 우아한 해결책이다.

관련 정보