Met*_*ind 28 launchd launchctl osx-yosemite macos
我有一个 launchd 守护进程,~/Library/LaunchAgents它在小牛队中运行良好。但它不会从优胜美地公开测试版开始。守护进程plist是这样的(我的用户名是darksairUID 501)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.darksair.retrmail</string>
<key>ProgramArguments</key>
<array>
<string>/Users/darksair/bin/retrmail.py</string>
</array>
<key>KeepAlive</key>
<false/>
<key>StartInterval</key>
<integer>300</integer>
<key>LaunchOnlyOnce</key>
<false/>
<key>UserName</key>
<string>darksair</string>
<key>ProcessType</key>
<string>Standard</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
<key>StandardOutPath</key>
<string>/Users/darksair/logs/retrmail.log</string>
<key>StandardErrorPath</key>
<string>/Users/darksair/logs/retrmail.log</string>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
基本上它应该~/bin/retrmail.py每5分钟运行一次。
我注意到在 Yosemite 中,launchd 升级到 2.0,并且 launchctl 有新的命令。我试过
sudo launchctl kickstart user/501/org.darksair.retrmail
Run Code Online (Sandbox Code Playgroud)
它说
Could not find service "org.darksair.retrmail" in domain for uid: 501
Run Code Online (Sandbox Code Playgroud)
我也试过老派
sudo launchctl load ~/Library/LaunchAgents/retrmail.plist
Run Code Online (Sandbox Code Playgroud)
它说
/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions
Run Code Online (Sandbox Code Playgroud)
该文件归我和员工组所有。我以相同的错误尝试了权限 644 和 600。
那么有谁知道如何在优胜美地正确启动 launchd 守护进程?
更新:看起来我的启动代理文件必须归root:wheel. 在我 chown 之后,我尝试了
sudo launchctl load ~/Library/LaunchAgents/retrmail.plist
Run Code Online (Sandbox Code Playgroud)
它没有发出任何错误。我认为我的守护进程运行正常。我将这个问题保持开放,因为我记得 launchd 文档明确指出启动代理文件可由运行守护程序的用户拥有。
UPDATE2:不,它没有正常运行。它只运行了一次,但没有再次运行,就好像它被卸载了一样。
UPDATE3:我升级到 Yosemite public beta 3,并将我的代理更改为此
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.darksair.retrmail</string>
<key>ProgramArguments</key>
<array>
<string>/Users/darksair/bin/retrmail.py</string>
</array>
<key>StartInterval</key>
<integer>300</integer>
<key>UserName</key>
<string>darksair</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
<key>StandardOutPath</key>
<string>/Users/darksair/logs/retrmail.log</string>
<key>StandardErrorPath</key>
<string>/Users/darksair/logs/retrmail.log</string>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
我重新加载了这个代理,我认为现在它可以正常工作了。我仍然没有解决这个问题,因为我不知道我之前的 plist 有什么问题。
总之,我发现我必须将 plist 的所有者更改root:wheel为才能加载它。
dii*_*eep 22
从 man launchctl
请注意,每个用户的配置文件 (LaunchAgents) 必须由 root 拥有(如果它们位于 /Library/LaunchAgents)或加载它们的用户(如果它们位于 $HOME/Library/LaunchAgents)。所有系统范围的守护进程 (LaunchDaemons) 都必须由 root 拥有。配置文件必须禁止组和世界写入。出于安全原因,这些限制到位,因为允许对 launchd 配置文件的可写性允许指定将启动哪个可执行文件。
修复是
sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist
Run Code Online (Sandbox Code Playgroud)
找到了解决办法。
在这种情况下正确的命令是
launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist
Run Code Online (Sandbox Code Playgroud)
并卸货,
launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist
Run Code Online (Sandbox Code Playgroud)
不知道为什么launchctl load需要 root,但无论如何都不推荐加载/卸载。
| 归档时间: |
|
| 查看次数: |
62370 次 |
| 最近记录: |