我有一个简单的 python 脚本,它从我的下载文件夹中移动文件。当我通过终端运行该脚本时,该脚本运行良好。当它通过 launchd 运行时会出现问题:
Traceback (most recent call last):
File "/Users/ben/Project/Automation/CleanDownload.py", line 11, in <module>
for f in listdir(downloadFolder):
OSError: [Errno 1] Operation not permitted: '/Users/ben/Downloads/'
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
我最近在两台不同的机器上注意到的一点是,通过MacPorts安装的Apache2似乎在我启动时停止了启动.诚实的事实是,我不能发誓之前这样做,但我认为这是我注意到的,因为安装LaunchDaemon是我安装过程的一部分.事实上,如果我尝试重新加载LaunchDaemon,它将失败:
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist
org.macports.apache2: Already loaded
Run Code Online (Sandbox Code Playgroud)
除非我手动启动Apache(使用sudo apachectl restart),否则在我的进程列表中对"apache2"或"httpd"进行grep'ing只产生:
$ sudo ps -ef | egrep "apache2|httpd"
0 52 1 0 0:00.06 ?? 0:00.08 /opt/local/bin/daemondo --label=apache2 --start-cmd /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper start ; --stop-cmd /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper stop ; --restart-cmd /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper restart ; --pid=none
Run Code Online (Sandbox Code Playgroud)
1410639199 6960 6792 0 0:00.00 ttys001 0:00.00 egrep apache2 | httpd
看起来守护进程本身就位,但没有可执行文件.据我所知/可以说,相关的可执行文件(httpd和apachectl)是每个人都可以执行的.
有没有其他人注意到这一点?有任何想法吗?
UPDATE
按照下面的要求,我确实执行了launchctl list.列表很长,我不知道如何剪切它,但足以说没有org.macports.*列出任何项目.这本身很有趣,因为我的MySQL守护进程以相同的方式加载.它有效,但也没有出现在列表中.如果真的需要整个输出,请告诉我.
UPDATE
我以为我是launchctl list在sudo下执行的,但是下面的mipadi评论提示,我再次尝试确保我这样做了,我认为不正确.在sudo下执行时,将显示MacPorts项:
51 - org.macports.mysql5
52 - org.macports.apache2
Run Code Online (Sandbox Code Playgroud)
我不确定这是否会有所帮助,但它仍然是一些信息.
UPDATE
我在 …
只是想知道是否有人已成功提交应用程序或知道使用launchd的Mac App Store中存在的应用程序.
谢谢.
我创建了一个始终在root下运行的Mac OS X帮助应用程序.我需要从它启动其他应用程序,但不能以root 身份启动.我希望它从当前登录用户(不是sudoed root)启动.
我尝试使用[NSTask launchedTaskWithLaunchPath:arguments:]和许多其他方法,但他们都使用root权限来启动我的应用程序.
如何从助手启动我的应用程序作为当前Mac OS X登录用户?
你如何在沙盒中使用LaunchAgent?我想在我的主应用程序中分发一个无UI的LaunchAgent应用程序包,我可以按需启动它.我想要这个而不是XPC服务的原因是该KeepAlive选项,这将防止launchd在其空闲时自动杀死我的进程.XPC服务上不存在此选项.
文档说有一个需要复制的plist,~/Library/LaunchAgents这显然不可能在沙盒中.是否有某种系统API可以为我复制plist?我已经看过Apple的SMJobBless示例代码,但它似乎是用于注册特权LaunchDaemon而不是无特权的LaunchAgent.
我正在尝试卸载我的旧sql,以便我可以安装一个新的.我正在关注这篇文章,但坚持到了launchctl unload.
[~/Library/LaunchAgents]$ ls com.adobe.ARM.202f4087f2bbde52e3ac2df389f53a4f123223c9cc56a8fd83a6f7ae.plist
com.mysql.mysqld.plist
com.facebook.videochat.ava.plist
homebrew.mxcl.postgresql.plist
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
launchctl: Couldn't stat("/Users/ava/Library/LaunchAgents/homebrew.mxcl.postgresql.plist"): No such file or directory
nothing found to unload
为何无法在文件中找到该文件?
当应用程序进程启动XPC帮助程序进程时,它实际上并不以经典的UNIX样式执行fork()/ exec()本身.相反,它向launchd发送一条消息,它为它做了肮脏的工作.因此,如果您在XPC进程上查询父进程,它将作为launchd进程返回.
但是,如果在分层流程视图中打开活动监视器,则XPC帮助程序进程将显示在请求它们的原始应用程序下方,例如:

在我正在研究的软件中,了解这些过程之间的关系将非常有用.到目前为止,我们一直在使用常规的BSD父进程信息,但随着一切都向XPC发展,这已经不再使用了.
所以:
有一个kext涉及,所以我很乐意在内核而不是用户空间中直接提取这些信息,但我似乎无法弄清楚它存储在哪里.
更新:关于Apple的darwin-kernel邮件列表的讨论:http://lists.apple.com/archives/darwin-kernel/2015/Mar/msg00001.html
我正在尝试让脚本每天同时运行以重新启动 Mac。我无法使用节能首选项面板中的内置计划功能,因为我正在运行阻止正常重启的应用程序。如果我通过终端中的命令启动重新启动,shutdown它将强制重新启动,无论哪些应用程序可能会阻止它。
我对 shell 脚本和 launchd 非常陌生,所以我真的是一个新手级别,所以请记住这一点。这是我在这里发表的第一篇文章,但多年来我定期访问并通常找到我正在寻找的答案。
在尝试了各种事情之后,我遇到了一些障碍。我所在的位置是 /Library/LaunchDaemons 文件夹中有一个 .plist 文件,该文件指向应在特定时间运行的脚本。我最初尝试使用在线教程中找到的代码在 bbedit 中编写 .plist 文件。它总是无法加载到 launchctl (手动或通过重新启动)。然后我尝试使用 Xcode 中的 plist 编辑器,效果似乎更好。
完成此操作后,plist 将加载到 launchctl 中。它似乎还尝试在指定时间运行脚本。我查看了控制台,Mac 似乎确实尝试运行该脚本,但失败并出现以下错误:
com.apple.xpc.launchd[1] (com.apple.restart.sh[940]): 服务退出并出现异常代码: 1
我尝试直接从终端运行脚本,例如sh scriptname,Mac 重新启动。
这是脚本:
#!/bin/bash
shutdown -r now
Run Code Online (Sandbox Code Playgroud)
我将脚本保存在 /Library/Scripts 文件夹中。
这是 .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.apple.restart.sh</string>
<key>Program</key>
<string>/Library/Scripts/com.apple.restart.sh</string>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>50</integer>
</dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
我现在真的不知道出了什么问题,因为 .plist 似乎已成功加载到 launchctl 中,并且脚本尝试在指定时间运行但失败了。如果手动运行该脚本,它就可以工作。 …
我在三个不同的位置launchctl: Dubious ownership on file (skipping): ~.plist
nothing found to load运行launchctl load命令得到了同样的错误,如下所示,并且它们都没有工作:
sudo launchctl load /Library/LaunchDaemons/updates.novel.plist
sudo launchctl load /Library/LaunchAgents/updates.novel.plist
sudo launchctl load /Users/username/Library/LaunchAgents/updates.novel.plist
Run Code Online (Sandbox Code Playgroud)
以下是我的updates.novel.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>GroupName</key>
<string>admin</string>
<key>UserName</key>
<string>Username</string>
<key>Debug</key>
<true/>
<key>Label</key>
<string>updates.novel</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/AMPPS/php-5.3/bin/php</string>
<string>/Applications/AMPPS/www/files/allnovels/novel.php</string>
<string>--daemon</string>
</array>
<key>StandardErrorPath</key>
<string>/var/log/files/error.1.log</string>
<key>StandardOutPath</key>
<string>/var/log/files/error.2.log</string>
<key>RunAtLoad</key>
<true/>
<key>AbandonProcessGroup</key>
<true/>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>14</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud) 我有一个通过launchd启动的守护进程.即使在DarkWake期间也会运行,并且在OS X重新进入睡眠状态之前没有时间完成.
我可以想到以下解决方案,但没有找到实现这一目标的方法.
不要在DarkWake期间运行此守护程序进程.
我浏览了Apple文档和论坛,但没有找到任何参考.
在DarkWake期间,通过守护进程使操作系统等待直至完成.
尝试在守护进程中调用pmset noidle和caffeinate.它没用.OS X进入睡眠状态.在DarkWake模式下,OS X似乎禁止传递许多通知.
在守护程序进程中检测DarkWake模式.
没有找到任何解决方案/方法来检测DarkWake模式.
请帮忙.