我编写了一个小的 python 脚本,将其作为 LaunchDaemon 运行,以将启动/关闭时间记录到远程数据库。当脚本启动时,它会记录启动时间,然后暂停并等待捕获 SIGTERM 以记录关闭时间。几乎相同的工作流程被用作登录/注销时间的启动代理。
然而,苹果公司的突然终止机制似乎给事情带来了麻烦。看来,当机器关闭或重新启动时,launchd只是SIGKILL向launchdaemons和launchagents发送信号,无法处理。我可能在技术细节上是错误的,但这本质上就是我所经历的。
使用 launchctl 手动加载/卸载守护进程会触发处理程序SIGTERM。然而,当系统真正关闭时,不会触发相同的代码。
有人对如何预防有建议吗SIGKILL?
我有一个 python 脚本,由于某种原因我正在通过 shell 脚本执行它(这里不重要)。在我的脚本中,我基本上是在获取一些 url 内容并将电子邮件发送给特定的人。我使用类似这样的东西添加了安全钥匙串
从命令行运行时,系统提示我为“安全”命令授予对钥匙串项目的访问权限。通过 Keychain Access 授予访问权限后,我可以运行该脚本,它不再提示检索密码,并且会向我发送电子邮件。
但是 Cron Job 和 Launchd 没有给我想要的输出。在谷歌上搜索了一下之后,我发现 cronjob 无法访问钥匙串,如果我想让它达到目的,我需要在作为 cron 作业运行时提供密码。我不太确定 launchd 是否可以访问钥匙串。它似乎对 Ruby 的以下人员有效。 https://lists.macosforge.org/pipermail/launchd-dev/2008-August/000363.html
我和那个人有同样的问题。从 launchctl 调用时,我没有收到任何电子邮件。但是,如果我在代码中硬编码密码,我会在指定时间收到电子邮件。所以我假设我的问题是launchd无法读取的钥匙串。有没有办法将钥匙串的访问权限授予launchd?我在 $HOME/Library/LaunchAgents 目录中有我的 com.Query.plist 文件。
我有一个简单的应用程序部署到运行10.5.8的Mac mini
如何在计算机重新启动时重新启动延迟作业工作人员?
我的OsiriX应用程序将突然不再启动.然后我从Mountain Lion升级到Mavericks并安装了最新版本5.8.它仍然无法启动.
失败的同时还有一条消息:"OsiriX已损坏,无法打开.您应该将其移至垃圾箱."
当然,这是在我下载应用程序后发生的.再次.
这是我发现的似乎相关的控制台消息:
11/4/13 10:37:49.848 PM launchservicesd [55]:有人试图启动应用程序App:"OsiriX"asn:0x0-7b07b pid:5959 refs = 6 @ 0x7fdd1ac590b0但它仍然有_kLSApplicationLockedInStoppedStateKey = true,所以它是停下来.:LASApplication.cp#2468 SetApplicationInStoppedState()q = LSSession 100004/0x186a4 queue 11/4/13 10:37:52.873 PM CoreServicesUIAgent [5961]:错误SecAssessmentCreate:操作无法完成.(OSStatus错误-67054.)11/4/13 10:38:05.147 PM com.apple.launchd.peruser.501 [147] :( [0x0-0x7b07b] .com.rossetantoine.osirix [5959])已退出:已杀死:9
我不是程序员.我很欣赏有关该怎么做的想法.
谢谢.
霍华德
我正在阅读@AlexGray的这个答案,它解释了如何限制进程的内存使用MAC OSX.
答案是:
您可以为您的可执行文件设置一个launchd项目.. plist的重要部分是一个部分,例如..
Run Code Online (Sandbox Code Playgroud)<key>SoftResourceLimits</key> <dict> <key>Stack</key> <integer>10000000000</integer> </dict>有各种可用的键......可以在Apple的MAN页面上找到.
我不明白这个答案.我并不是真正意识到推出的项目是什么(虽然我现在读了一下),几乎不知道一个plist和一个键是什么,并且Apple-MAN页面的链接显得破碎.
您能否通过制作一个关于如何使用此解决方案的简单完全可重复的示例来帮助我?
我正在研究launchd从plist文件下/Library/LaunchDaemons/或通过命令加载它的服务的方式launchctl load
到目前为止,我已经设法收集了一些不同的来源,并按照我的理解组成了以下模糊的图片:
在服务加载时 ( launchctl load) 进程launchctl向launchd发送一条适当的XPC消息,然后将launchd其分叉到具有上下文的新进程中xpcproxy。这个通用进程正在等待来自 的另一个 XPC 调用launchd以根据 launchDaemon plst 运行它的真实进程上下文。
这个解释听起来对吗?也许有人可以帮我使它更准确?
谢谢
我有一个简单的脚本,可以在文件发生更改时将其上传到保管箱。我想在系统启动时运行它并将其保留在后台以便让脚本监视文件。
我创建了一个 plist,但它运行脚本并以代码 0 退出。
列表
<?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>com.example.launchd.dropbox_uploader</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>~/dropbox-uploader.sh; wait</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
wait(在命令中使用或不使用都不起作用)
脚本(它工作正常并且在命令行中运行时不会退出)
#!/bin/sh
fswatch -o ~/file.txt | xargs -n1 -I{} curl -X POST https://content.dropboxapi.com/2/files/upload \
--header 'Authorization: Bearer XXXXX' \
--header 'Content-Type: application/octet-stream' \
--header 'Dropbox-API-Arg: {"path":"/backup/file.txt","strict_conflict":false,"mode":{".tag":"overwrite"}}' \
--data-binary @'~/file.txt'
Run Code Online (Sandbox Code Playgroud)
launchtl list输出
~> launchctl list | grep com.example (base)
- 0 com.example.launchd.dropbox_uploader
Run Code Online (Sandbox Code Playgroud)
如何实现让它在后台运行的目标?我不确定我的 plist 或脚本是否有问题。
我有一个以root身份运行的应用程序(一个守护进程/ Library/StartupItems),它偶尔会启动另一个进程system("open /Applications/MyAppName.app").这工作正常,但在某些计算机上,MyAppName以root身份启动,而不是在当前用户下运行.
我试图弄清楚为什么会这样,以及如何让应用程序始终作为当前用户启动.
问题似乎发生在运行某些Open/Active目录组合的企业站点上.我对这些机器的访问有限,所以在我请求更多时间之前,我试图至少形成一些假设.
另外一条线索是,如果你打开活动监视器并检查"Finder"进程,至少有一台计算机,"用户:"部分显示用户名但没有用户ID("(UID)"部分完全缺失了).
此外,父流程显示为" launchd (1)"而不是launchd (95)像大多数标准应用程序那样" ".我认为这个launchd实例是在计算机启动并以root身份运行的第一件事,与其他以登录用户身份运行的launchd实例相比.
除了显而易见的安全问题之外,我还要求应用程序不以root身份运行,以便它可以支持两个同时登录的用户打开/可见的内容.
有没有人对可能导致这种情况的原因有什么看法,或者我怎么解决它?