我编写了一个独立的Objective C命令应用程序。如果我通过LaunchDaemon运行它,它通过DistriutedObjects通信由ObjC客户端应用程序连接时运行正常。如果我在命令行运行它,它运行得很好。如果我在Bash脚本调用时运行它,它运行得很好。但是,我尝试通过root用户的crontab运行它的各种方式,它会执行有关指针分配的崩溃报告:
Apr 14 05:27:00 volomike cron[72531]: cron(72531,0x7fff7d2fa000) malloc: *** error for object 0x7fb9c8400213: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Apr 14 05:27:00 volomike diagnosticd[70689]: error evaluating process info - pid: 72531, puniqueid: 72531
Apr 14 05:27:00 volomike com.apple.xpc.launchd[1] (com.vix.cron[72531]): Service exited due to signal: Abort trap: 6
Apr 14 05:27:00 volomike com.apple.xpc.launchd[1] (com.apple.ReportCrash.Root[72550]): Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.ReportCrash.DirectoryService
Apr 14 05:27:00 volomike ReportCrash[72550]: Saved crash report for cron[72531] version 39 to /Library/Logs/DiagnosticReports/cron_2016-04-14-052700_volomike.crash
该崩溃报告的重要部分是:
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Application Specific Information:
abort() called
*** error for object 0x7fb9c8400213: pointer being freed was not allocated
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x00007fff9490ff06 __pthread_kill + 10
1 libsystem_pthread.dylib 0x00007fff9c45e4ec pthread_kill + 90
2 libsystem_c.dylib 0x00007fff9345b6e7 abort + 129
3 libsystem_malloc.dylib 0x00007fff9c02f041 free + 425
4 cron 0x000000010367aa41 0x103677000 + 14913
5 cron 0x000000010367a7e4 0x103677000 + 14308
6 cron 0x0000000103679572 0x103677000 + 9586
7 cron 0x000000010367925a 0x103677000 + 8794
8 cron 0x000000010367885e 0x103677000 + 6238
9 libdyld.dylib 0x00007fff949835ad start + 1
在各种方面,我已经使用这些不同的cron行完成了它,但是在尝试调用命令时它们会立即崩溃,甚至当我有NSLog()写入/var/log/system.log所有内容时从主应用程序开始到应用程序结束的方式,没有任何内容写入 - 就像当cron尝试调用我的命令时,它会立即死机,并显示有关指针分配的崩溃报告。
41 5 * * * /bin/bash '/Applications/My App.app/Contents/Resources/mytoolcommand.sh' /q /sched
41 5 * * * /bin/bash '/Applications/My App.app/Contents/Resources/mytoolcommand.sh' /q /sched &
41 5 * * * '/Applications/My App.app/Contents/Resources/mytoolcommand' /q /sched
41 5 * * * '/Applications/My App.app/Contents/Resources/mytoolcommand' /q /sched &
再次注意,如果我执行'/Applications/My App.app/Contents/Resources/mytoolcommand.sh' /q /sched
,它运行得很好,/bin/bash '/Applications/My App.app/Contents/Resources/mytoolcommand.sh' /q /sched
和'/Applications/My App.app/Contents/Resources/mytoolcommand' /q /sched
一样运行
我甚至做了一个变种,其中cron调用my myololcommand.sh脚本并简单地将Hello World写入/tmp/out.txt,它运行得很好。所以,我知道我的crontab正在运行。
你可以帮我弄明白我做错了什么吗?一些疑似可能的问题:也许OSX El Capitan因为某些原因关闭我的应用程序,例如没有正确签名。 (我现在正在调试。除非处理.app文件夹,否则我之前从未遇到过签名问题。此外,我可以在没有签名警告的情况下从命令行运行它。)
我从主要()开始加载调试消息。他们应该写入/var/log/system.log,但他们不是。这告诉我应用程序在被cron调用时立即崩溃。那么,我需要加载到我的应用程序库中以便在cron下调用时正常运行吗?
DEVELOPMENTS
我怀疑El Capitan Gatekeeper可能是原因。因此,我在main.mm文件中创建了一个简单的Objective C控制台应用程序,并进行了编译。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *sTest = @"Hello World";
[sTest writeToFile:@"/tmp/test.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
return 0;
}
Cron似乎运行得很好,所以看起来不像看门人问题。
我解决了问题,但只是简单地说。我在一个全新的项目中重新编译了该项目,复制了源代码和设置。然后我通过cron运行命令大约4次没有问题。但是,当我第五次运行它时,它再次失败并继续失败。
所以,我想我将不得不弄清楚如何将其转换为LaunchAgent。
答案 0 :(得分:0)
答案是你不要。您不再在OSX上使用cron来处理您正在编码的应用程序。而是切换到LaunchAgent。当然,Apple会保留它以支持POSIX,因此可能会保留很长时间,但即使是他们的网站也鼓励人们不再使用cron进行应用程序编码。
&#34;注意:虽然仍然支持它,但不推荐使用cron 解。它已被弃用,有利于launchd。&#34;
不幸的是,LaunchAgents尚未(至少在10.11.4中)支持cron风格的语法。 (是的,我已经为你向Apple提出了这个建议。)所以,没有使用破折号,逗号或反斜杠。相反,它只支持一个整数和多个块来创建每个时间帧。如果这不够合适,那么至少设置最小的时间范围,然后在你正在启动的任何代码中执行剩下的代码,这样,例如,如果你想要的东西只在第一个星期一运行本月,LaunchDaemon会在前七天启动,但如果该应用程序不是该月的第一个星期一,则会关闭。