launchdでリムーバブルディスクへのrsyncバックアップがエラーになった場合の解決法 その2
以前こちらの記事で解決した問題がまた再発してしまったので,再解決しました.
環境
- macOS: 26.6.1 (Tahoe)
- launchd: 7.0.0
問題
.appファイルの元になるAppleScriptを紛失してしまったので,作り直してlaunchdで動作させたところ,バックアップの実行のたびに以下のような許可ダイアログが表示されるようになりました.
.appファイル単体で起動しても毎回表示されます.
"media-backup.app" would like to access files on a removable volume.原因
AppleScriptを.app化したものが未署名だったため,許可ダイアログでAllowを選んでもプライバシ設定が保存されていなかったようです.
codesign -dr - bin.local/media-backup.app
#> Executable=/Users/hoge/bin.local/media-backup.app/Contents/MacOS/applet
#> bin.local/media-backup.app: code object is not signed at all動くバックアップ定期実行タスクの作り方
以下のように作ることで警告が表示されずに,正常に動作するようになりました.
セキュリティ設定のリセット
一応念のため,これまで許可した残骸が残っているかもしれないので,リセットしました.
mdls -name kMDItemCFBundleIdentifier bin.local/media-backup.app
#> kMDItemCFBundleIdentifier = "com.apple.ScriptEditor.id.media-backup"
tccutil reset SystemPolicyRemovableVolumes com.apple.ScriptEditor.id.media-backup
tccutil reset SystemPolicyAllFiles com.apple.ScriptEditor.id.media-backupSystemPolicyAllFilesに対してもリセットしているのは,試行錯誤していたときに,システム設定のプライバシ設定におけるFull Disk Accessに.appを手動で入れたりしていたためです.
バックアップ実行用.appファイルの作成
Script Editorで,以下のようなAppleScriptのコードを作ります.media-backupは内部でrsyncを使っている自前のスクリプトです.
on run
do shell script "/bin/zsh /Users/hoge/bin.local/media-backup"
end runこれを,File > Exportから.appとしてエクスポートします.
このとき,Code SignがSign to Run Locallyになっていることを確認してください.
こうして出力した.appファイルには署名がされていることが確認できます.
codesign -dr - launchd/media-backup.app
#> Executable=/Users/hoge/Documents/backup/launchd/media-backup.app/Contents/MacOS/applet
#> # designated => cdhash H"ca78285eaa28017638e000000000000000000000" or cdhash H"f66d7116ab8f5dea424439f80000000000000000" or cdhash H"a3daf0956dc71fc2ff0000000000000000000000" or cdhash H"cb17b99302ef6c00000000000000000000000000"File FormatでApplicationを選んだ場合,Code SignはSign to Run Locallyがデフォルトで選択されていると思いますが,私の環境では一度Code Signのセレクトボックスをクリックして開かないと,Sign to Run Locallyが選択されているにも関わらず署名がされない現象が起きました.上記のコマンドで,出力された.appの署名を確認することを推奨します.
この.appファイルを複数回実行したところ,2回目以降は許可ダイアログが表示されなくなりました!
launchdへの登録
ここからは以前の記事と内容は同じです. まずは,このような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>my.mediabackup</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/open</string>
<string>/Users/hoge/bin.local/media-backup.app</string>
</array>
<key>StartInterval</key>
<integer>86400</integer>
</dict>
</plist>これを~/Library/LaunchAgentsに置いて,lauchctlコマンドで登録します.
cp my.mediabackup.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/my.mediabackup.plistおわり.