launchctl을 사용하여 데스크탑 폴더를 측정할 때 오류가 발생했습니다.
편집: 이 오류는 특정 폴더(예: 데스크톱)에서만 발생합니다. 다른 폴더(예: /etc)에서는 잘 작동합니다. 아래 test.sh 스크립트는 단순히 데스크탑에서 tar 명령을 실행합니다. 내 백업이 진짜 문제였습니다. 백업에는 다양한 디렉터리가 포함되어 있었습니다. 또한 Catalina OS로 업그레이드한 후에 실행되는 것으로 보입니다.
tar: 확장된 속성을 압축할 수 없습니다. 작업이 허용되지 않습니다.
tar: 멤버 이름 a에서 선행 '/'를 제거합니다. Users/davidk/Desktop
tar: /Users/davidk/Desktop: 디렉토리에 액세스할 수 없습니다: 알 수 없는 오류: -1
tar: 오류로 인해 이전 오류로 인해 종료가 지연되었습니다.
안전과 관련이 있는 것 같아요. launchctl 및 bsdtar에 전체 디스크 액세스 권한을 부여하려고 시도했지만 여전히 오류가 발생합니다.
나의 목록:
more /Library/LaunchDaemons/test.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>test</string>
<key>ProgramArguments</key>
<array>
<string>/etc/cron.daily/test.sh</string>
</array>
<key>StandardOutPath</key>
<string>/var/log/test.log</string>
<key>StandardErrorPath</key>
<string>/var/log/test.log</string>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>1</integer>
</dict>
<key>ProcessType</key>
<string>Background</string>
</dict>
</plist>
[davids-imac:cron.daily root]$ launchctl start test
결과:
backup.sh begin '11/07/2019 12:10:00'
Script executed from: /
Script location BASEDIR: /etc/cron.daily
running DAILY
192.168.1.225:/home/backup/davids-imac.dkcc.com/Thu/ -> Should be 192.168.1.225:/home/backup/davids-imac.dkcc.com/Thu
end tests
Running! '11/07/2019 12:10:00'
12:10:00 rm /usr/local/backup/davidk-Desktop.tar.gz
12:10:00 tar /davidk/Desktop..
tar: Could not pack extended attributes: Operation not permitted
tar: Removing leading '/' from member names
a Users/davidk/Desktop
tar: /Users/davidk/Desktop: Couldn't visit directory: Unknown error: -1
tar: Error exit delayed from previous errors.
12:10:00
tar 파일은 다음과 같습니다.
-rw-r--r-- 1 root wheel 127 Nov 7 12:10 davidk-Desktop.tar.gz
그러나 터미널에서 실행하는 경우:
[davids-imac:cron.daily root]$ ./test.sh
backup.sh begin '11/07/2019 12:23:46'
Script executed from: /etc/cron.daily
Script location BASEDIR: .
running DAILY
192.168.1.225:/home/backup/davids-imac.dkcc.com/Thu/ -> Should be 192.168.1.225:/home/backup/davids-imac.dkcc.com/Thu
end tests
Running! '11/07/2019 12:23:46'
12:23:46 rm /usr/local/backup/davidk-Desktop.tar.gz
12:23:46 tar /davidk/Desktop..
tar: Removing leading '/' from member names
12:26:17
12:26:17 removing PID
12:26:17 Complete!
Began: '11/07/2019 12:23:46', Completed: 12:26:17
tar 파일은 다음과 같습니다.
-rw-r--r-- 1 root wheel 5059085737 Nov 7 12:26 davidk-Desktop.tar.gz
편집: test.sh 추가 - 이는 단순화된 백업이지만 문제를 tar 명령으로 격리합니다.
[davids-imac:cron.daily root]$ more test.sh
#!/bin/bash
START_TIME=`date +"'%m/%d/%Y %H:%M:%S'"`
PIDFILE=/var/run/dkccBackup.pid
BKUPFILE=/etc/backup/bkup.sh
LOCAL_DIR=/usr/local/backup
MONTHLY_IP=192.168.1.230
DAILY_IP=192.168.1.225
RUN_IP=" "
MDATE=" "
HOSTNAME=`hostname`
echo "backup.sh begin ${START_TIME}"
echo "Script executed from: ${PWD}"
BASEDIR=$(dirname $0)
echo "Script location BASEDIR: ${BASEDIR}"
if [ "${BASEDIR}" == "/etc/cron.daily" ] || [ "${PWD}" == "/etc/cron.daily" ]; then
echo "running DAILY"
RUN_IP="$DAILY_IP"
MDATE=`date +%a`
elif [ "${BASEDIR}" == "/etc/cron.monthly" ] || [ "${PWD}" == "/etc/cron.monthly" ]; then
echo "running MONTHLY"
RUN_IP="$MONTHLY_IP"
MDATE=`date +%B`
else
echo "Cannot determine Monthly or daily, assuming daily"
RUN_IP="$DAILY_IP"
MDATE=`date +%a`
fi
BACKUP_DIR="${RUN_IP}:/home/backup/${HOSTNAME}/${MDATE}"
echo " $RUN_IP:/home/backup/`hostname`/`date +%a`/ -> Should be $BACKUP_DIR"
echo end tests
timeout=6 # timeout after 60mn
while ((timeout > 0)) && [ -f $PIDFILE ];
do
echo Sleeping 10 minutes `date +"'%m/%d/%Y %H:%M:%S'"`
sleep 1000
((timeout -= 1))
done
echo Running! `date +"'%m/%d/%Y %H:%M:%S'"`
touch $PIDFILE
echo `date +"%T"` rm $LOCAL_DIR/davidk-Desktop.tar.gz
rm -f $LOCAL_DIR/davidk-Desktop.tar.gz
echo `date +"%T"` " tar /davidk/Desktop.."
/usr/bin/tar --no-xattr -zcf $LOCAL_DIR/davidk-Desktop.tar.gz /Users/davidk/Desktop
echo `date +"%T"` " "
echo `date +"%T"` " removing PID"
rm -f $PIDFILE
echo `date +"%T"` " Complete!"
echo "Began: ${START_TIME}, Completed: `date +"%T"`"
답변1
나는 그것에 대해 생각했다. 이것은 안전합니다.
/bin/bash에 대한 전체 디스크 액세스를 제공해야 합니다.
시스템 환경설정 -> 보안 및 개인정보 보호
"개인정보" 탭에서 "전체 디스크 액세스"까지 아래로 스크롤하세요.
자물쇠를 클릭하고 비밀번호를 입력하세요.
새 파인더 창을 열고 /bin 폴더로 이동합니다.
bash 아이콘을 "다음 응용 프로그램의 데이터 액세스 허용" 영역으로 드래그하면 이제 tar가 작동합니다.
앞서 디스크 액세스를 허용하기 위해 bsdtar, launchctl, 터미널도 드래그했습니다.