在 MacOS 上使用 launchd 调用脚本不起作用

问题描述 投票:0回答:1

问题

我需要监视

Users/<user name>/Libraries/Developer/Xcode/DerivedData
中的特定文件夹。我编写了一个脚本,该脚本应始终在后台运行以监视文件夹。当我们尝试从启动的
访问
Users/

中的任何内容时,我似乎遇到了权限问题

我尝试了什么?

我尝试按照此Apple 论坛讨论中提到的步骤设置一个启动守护程序来调用特定脚本。

脚本

logger 'Hello Cruel World!'

脚本保存在路径 -

/usr/local/bin/greetings.sh

启动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>com.example.hello</string>
 <key>ProgramArguments</key>
 <array>
 <string>/usr/local/bin/greetings.sh</string>
 </array>
 <key>RunAtLoad</key>
 <true/>
</dict>
</plist>

plist 保存在路径 -

/Library/LaunchDaemons

执行加载启动并提供权限的命令

  1. sudo chmod +x /usr/local/bin/greetings.sh
    -> 制作脚本 可执行并授予根级别权限。
  2. sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.hello.plist
  3. sudo launchctl start com.example.hello

通过

log show —predicate 'process == "logger"' —info | grep "Hello Cruel World"
打印日志时,我可以看到
Hello Cruel World
正在打印。

调查结果

在我的初步调查中,我怀疑问题可能在于脚本所具有的权限。

当脚本处于

/usr/local/bin
->

ls -l /usr/local/bin/greetings.sh
-rwxr-xr-x  1 root  wheel  <Date> /usr/local/bin/greetings.sh

当脚本处于

/Users/<user_name>/Desktop
->

/Users/<user>/Desktop/greetings.sh
-rwxr-xr-x@ 1 root  staff  40 <date> /Users/<user>/Desktop/greetings.sh

区别在于工作人员和轮级权限之间。

问题

我是否缺少明确执行的操作,以向脚本授予对位置

Users/<user>
中对文件执行 CRUD 等操作的脚本的适当权限?根据我的理解
sudo
权限应该可以完成这项工作。

xcode bash macos terminal sudo
1个回答
0
投票

转到系统设置/隐私和安全/完整磁盘访问权限并授予脚本对完整磁盘的访问权限。

我认为脚本的位置并不重要,但许多 LaunchDaemon 使用 /Library/Application Support/... 作为其可执行文件。

在某些 Mac 上,我必须等待存储安装,因此我没有直接执行脚本,而是使用类似的命令执行 sh

        <key>ProgramArguments</key>
        <array>
                <string>sh</string>
                <string>-c</string>
                <string>while [ ! -x /Users/Shared/MyScript.sh ]; do echo StartWait; sleep 6; done; sleep 5; /Users/Shared/MyScript.sh arguments</string>
        </array>
© www.soinside.com 2019 - 2024. All rights reserved.