macOS의 cron에서 Bash 스크립트를 호출할 때 와일드카드 확장이 발생하지 않습니다.

macOS의 cron에서 Bash 스크립트를 호출할 때 와일드카드 확장이 발생하지 않습니다.

Docker 컨테이너에서 InfluxDB를 실행하는 macOS Monterey를 실행하는 Mac mini가 있습니다. 데이터를 백업하고 압축하고 가장 최근 백업 7개만 유지하기 위해 호출하는 셸 스크립트를 통해 야간 cronjob을 설정하려고 합니다. 백업 부분은 수동으로 실행하든 cron을 통해 실행하든 완벽하게 작동하지만, 나를 슬프게 하는 것은 현재 백업 파일 수를 가져오는 cron의 셸 확장이므로 최신 백업 파일만 보관할 수 있다는 것입니다.

나는 운이 전혀 없이 cron에서 작동하도록 쉘 확장을 얻는 방법을 알아내려고 모든 것을 줄였습니다.

내가 생각해낸 가장 간단한 것은 수동으로 실행하면 다음과 같이 (올바르게) 동작한다는 것입니다.

$ /bin/bash -c 'BACKUPS=(/Users/virtualwolf/Documents/InfluxDB_Backups/*) && echo "Number of backups: ${#BACKUPS[*]}" && echo "Oldest backup: ${BACKUPS[0]}"'
Number of backups: 10
Oldest backup: /Users/virtualwolf/Documents/InfluxDB_Backups/2022-04-12_00-30.zip

정확히 동일한 내용을 cron에 넣으면 다음과 같은 결과를 얻습니다.

Number of backups: 1
Oldest backup: /Users/virtualwolf/Documents/InfluxDB_Backups/*

나는 cron이 기본적으로 사용된다는 것을 알고 있으며 그것을 내 위에 설정하려고 /bin/sh시도했지만 소용이 없었습니다(비록 shebang을 사용하여 스크립트를 직접 호출하면 아무런 효과가 없을 것이라고 생각하지만?).SHELL=/bin/bashcrontab#!/bin/bash

여기서 분명한 것을 놓치고 있습니까?

[편집하다] 좀 더 명확히 하기 위해 현재 테스트용으로 cron만 사용하고 있으며 가능한 가장 작은 시나리오를 달성하기 위해 실제 스크립트 파일 실행을 제외했습니다. 관련 crontab항목은 다음과 같습니다.

* * * * * /bin/bash -c 'BACKUPS=(/Users/virtualwolf/Documents/InfluxDB_Backups/*) && echo Number of backups: ${#BACKUPS[*]} && echo Oldest backup: ${BACKUPS[0]}'

/bin/bash -c 'BACKUPS=(/Users/virtualwolf/Documents/InfluxDB_Backups/*) && echo Number of backups: ${#BACKUPS[*]} && echo Oldest backup: ${BACKUPS[0]}'터미널에 똑같은 줄( )을 복사하면 예상대로 작동하고 10개의 파일이 나열되고 가장 오래된 백업이 표시됩니다. 실행될 때 cron쉘 확장은 아직 발생하지 않았으며 BACKUPS변수를 리터럴 문자열로 처리합니다 /Users/virtualwolf/Documents/InfluxDB_Backups/*.

답변1

따라서 좋은 질문에 대한 @muru 덕분에 이것은 cron 및 셸 확장과 전혀 관련이 없지만 /usr/sbin/cron시스템 환경 설정 > 보안 및 개인 정보 보호 > 개인 정보 보호에서 전체 디스크 액세스 권한이 없는 실행 파일의 경우인 것으로 나타났습니다.

환경 설정 창을 잠금 해제하고 "전체 디스크 액세스"로 이동하여 +를 클릭하고 CmdShiftG"폴더로 이동" 대화 상자를 클릭하여 /usr/sbin열고 cron추가한 후 이제 모든 것이 정상입니다.

관련 정보