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、およびターミナルもドラッグしました。

関連情報