我正计划编写一个小的守护程序,以检测另一个应用程序是否崩溃,并一直在思考系统将发送NSWorkspaceDidTerminateApplicationNotification,但事实并非如此。
假设我不想创建已启动的过程来简单地重新启动崩溃的应用程序,是否可以通过其他方式检测到崩溃?
也许我可以监视系统日志?这似乎是不适当的负担。
在OSX上使用launchctl来启动和停止服务看起来很棒,但我还是没有看到检查返回值以确保它确实启动.即使服务无法启动,返回值似乎总是回归为零
此plist文件包含错误,因此无法按预期启动Drizzle
% launchctl start /Library/LaunchDaemons/org.drizzlebad.plist
% echo $?
0
Run Code Online (Sandbox Code Playgroud)
除了检查此服务的pid文件是否存在之外的任何建议?
我开始使用launchd并且想要设置一个plist文件,这样每当我将SD卡插入我的Mac mini服务器(使用Snow Leopard Server)时,我想要一个shell脚本运行(应该复制所有的jpg文件) ,重命名他们等).
所以,我在〜/ Library/LaunchAgents中创建了一个plist文件(请参阅下面的内容 - 它应该寻找/ Volumes的更改)并创建了一个shell脚本,上面写着"beep" - 稍后它会做一些更有用的事情.
plist文件与launchctl注册,当我运行它(launchctl开始com.peters.runwhenSDmount),电脑说,每当一个存储卡已插入哔声,在没有存储卡的保持沉默.因此,plist确实调用了shell脚本,随后检查特定的SD卡是否存在.我认为这也证明了SD卡的权限没有问题.
但是,它似乎并不自行运行??? 知道为什么??
plist文件:〜/ Library/LaunchAgents/com.peters.runwhenSDmount.plist
<?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">
<dict>
<key>Label</key>
<string>com.peters.runwhenSDmount</string>
<key>LowPriorityIO</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/Users/peter/Library/Scripts/runwhenSDmount</string>
</array>
<key>ThrottleInterval</key>
<integer>10</integer>
<key>WatchPaths</key>
<array>
<string>/Volumes</string>
</array>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
shell脚本:〜/ Library/Scripts/runwhenSDmount
#!/bin/bash
if [ -d "/Volumes/NIKON D40X" ]; then
say beep
fi
Run Code Online (Sandbox Code Playgroud) 我在博物馆展览中使用一些iPad,运行由其他人开发的应用程序。即使我们已经覆盖了“主页”按钮,我仍然发现该应用偶尔会崩溃,从而使用户停留在“主页”屏幕上。他们可以从这里访问其他未经授权的应用程序。
博物馆不反对将iPad越狱,如果这样做能够为我们提供所需的解决方案,那么我一直在研究使用带有KeepAlive标签的launchd并将.plist文件放入/ Library / LaunchAgents目录中的想法。防止应用崩溃时防止其关闭或重新生成
到目前为止,我已经成功地使其能够与iPad随附的默认应用程序以及Cydia安装的应用程序一起使用,但是我无法使它重新启动所需的应用程序。我已经从/ User / Applications目录以及/ Applications进行了尝试,有人建议这样做可能会有所作为,但没有任何乐趣。有人可以提出可能的解决方案,还是我在浪费时间?我从下面的plist文件中插入了XML。
<?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.MVFieldguide.launchd</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Field Guide 2010.app/Field Guide 2010</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<true/>
</dict>
Run Code Online (Sandbox Code Playgroud)
我们有一个launchd守护程序,用于存储钥匙串内的用户名和密码.当我们尝试添加(使用SecKeychainAddGenericPassword)删除(使用SecKeychainFindGenericPassword和SecKeychainItemDelete)但我们无法获取使用SecKeychainFindGenericPassword设置的密码时,它会起作用.该函数返回
-25293 errSecAuthFailed : The user name or passphrase you entered is not correct.
Run Code Online (Sandbox Code Playgroud)
守护程序以root身份签名并运行.密码保存在系统钥匙串中.
当我们从带有sudo的终端运行应用程序时,它可以工作.它可以访问密码.但是当它在launchd中运行时,它不起作用.有没有什么阻止我们在launchd中使用钥匙串?
谢谢,Marc-Etienne
当我在Mac OS X 10.8上从Checkpoint(从这里)安装安全客户端时,它可以工作.
但是,只要我重新启动笔记本电脑1-2次,就不再显示错误了:
与VPN服务的连接丢失
每当从菜单栏图标单击选项或尝试连接时.
每隔10秒,这会写入system.log:
com.apple.launchd[1] (com.checkpoint.epc.service[1211]): Exited with code: 1
com.apple.launchd[1] (com.checkpoint.epc.service): Throttling respawn: Will start in 10 seconds
Run Code Online (Sandbox Code Playgroud)
这有什么解决方案或可能的原因吗?
我有一个python脚本已使用py2app转换为捆绑的应用程序.手动调用时,它运行正常.但是,在Mountain Lion下,当我尝试使用launchd调用它时,我在系统日志中收到以下错误:
8月8日07:15:02 StraylightPro.local Irrigate [79689]:Irrigate Error
8月8日07:15:02 StraylightPro.local coreservicesd [77]:应用程序应用程序:"Irrigate"[0x0/0x697596f] @ 0x0x7fe77240cec0试图提出,但不在fPermittedFrontASNs((ASN:0x0-0x1cb2cb1 :)),所以否认.
很明显,这是Mountain Lion中新安全功能的结果,但是通过Apple的开发人员文档搜索并在网上搜索"fPermittedFrontASNs"一词并未发现任何结果.
如果我可以将扩展属性添加到应用程序包或向launchd plist文件中添加一行来解决此问题,那将是非常好的.
我编写了一个简单的程序,该程序使用Cocoa定位服务来获取用户的当前位置。在MacBook Pro上它可以正常工作。但是,它不在MacBook Air上。
我只剩下一个Operation could not be completed. (kCLErrorDomain error 1.)代码,我已经尝试了很多修复它的方法(例如,设置权限)。在隐私设置中选中该应用程序的复选框以启用该应用程序的位置服务后,我启动该应用程序后,该复选框便消失了。
为了初始化服务,我使用startUpdatingLocationCLLocationManager类的方法。
有什么办法解决这个问题?
我需要将“ 服务器类型 ”应用程序绑定到OS X 10.6及更高版本上的特权端口(<1024)。该应用程序通常由没有root特权的用户执行。
阅读了本网站上的许多主题后,我发现此选项是最新和最安全的方法:
1)编写一个助手应用程序以打开特权端口。
2)使用SMJobBless来“安装”要启动的助手应用程序。
3)从主应用程序(通过IPC)调用帮助程序应用程序以检索打开的特权端口。
从Apple文档:
因为launchd本身以root用户身份运行,所以如果您使用特权进程的唯一原因是在一个低编号的端口上运行守护程序,则可以让launchd代表守护程序打开该端口,并将open套接字传递给守护程序,因此,您无需以root用户身份运行代码。
我不是在运行守护程序,而只是在用户应用程序上运行,但适用相同的原则。
我已经找到了SMJobBless的代码示例,并阅读了Nathan de Vries的博客。(不能使用XPC-在OSX 10.6上不可用)。
我很清楚SMJobBless /启动的编码。
我的问题: 请指向代码示例,该示例演示如何在另一个应用程序(即帮助程序)中打开端口并将端口句柄(CFSocketRef?)传递回主应用程序。也许有人可以给我指出一个通过SMJobBless实现此功能的代码示例。
非常感谢
我的任务是将 Tomcat/Jenkins 安装从已弃用(现已在 Yosemite 中删除)的 SystemStarter 框架移动到 launchd。它作为“构建”用户启动并运行良好,除了一件事。我们构建过程的一部分涉及调用“安全”命令来操作钥匙串。这失败如下:
security: cert import failed: write permissions error
security: problem decoding
Run Code Online (Sandbox Code Playgroud)
如果我通过 ssh 进入构建机器并从命令提示符启动 Tomcat,通过 bin/startup.sh,则调用security不会抱怨。它只在我通过 launchd 启动 Tomcat 时抱怨。我的 plist 看起来像这样:
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.apache.tomcat</string>
<key>UserName</key>
<string>builduser</string>
<key>WorkingDirectory</key>
<string>/Users/builduser</string>
<key>Program</key>
<string>/Users/builduser/bin/tomcat.sh</string>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<true/>
</dict>
<key>EnvironmentVariables</key>
<dict>
<key>CATALINA_HOME</key>
<string>/Users/builduser/Tomcat</string>
<key>CATALINA_OPTS</key>
<string>-Djava.awt.headless=true</string>
<key>JAVA_OPTS</key>
<string>-Xmx1024m -XX:MaxPermSize=512m</string>
</dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
plist 位于 /Library/LaunchDaemons 中,而 tomcat.sh 只是一个启动 tomcat 然后等待进程终止的包装器。