mac catalina tar는 launchctl에서 오류를 표시하지만 터미널에서 스크립트를 실행할 때는 오류가 발생하지 않습니다.

mac catalina tar는 launchctl에서 오류를 표시하지만 터미널에서 스크립트를 실행할 때는 오류가 발생하지 않습니다.

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, 터미널도 드래그했습니다.

관련 정보