gpt4 book ai didi

objective-c - 通过OSX Cron运行时,Objective C命令失败

转载 作者:行者123 更新时间:2023-12-03 10:00:29 28 4
gpt4 key购买 nike

我已经编写了一个独立的Objective C命令应用程序。如果我通过LaunchDaemon运行它,则在由ObjC客户端应用程序通过DistriutedObjects通信连接时,它运行得很好。如果我在命令行上运行它,它将运行正常。如果我在由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时,它们都立即崩溃。从main到应用程序的末尾,什么也没写-就像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调用了mytoolcommand.sh脚本,只是将Hello World写入了/tmp/out.txt,并且运行得很好。因此,我知道我的crontab正在工作。

您能帮我弄清楚我做错了什么吗?一些可能的问题:
  • 也许OSX El Capitan出于某种原因(例如未正确签名)关闭我的应用程序。 (我现在正在调试。除非它处理.app文件夹,否则我从来没有遇到过签名问题。此外,我可以从命令行运行它而不会出现签名警告。)
  • 我马上从main()加载了调试消息。他们应该写到/var/log/system.log,但不是。这告诉我应用程序在被cron调用时立即崩溃。因此,在cron下调用时,是否需要将一些特殊的东西加载到我的应用程序的库中才能使其正常运行?

  • 开发

    我怀疑是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看起来运行得很好,所以它看起来不像是Gatekeeper问题。

    我的问题可以解决,但是只是短暂的。我将该项目重新编译为一个全新的项目,复制了源代码和设置。然后,我通过cron运行了大约4次命令,没有任何问题。但是,当我第五次运行它时,它再次失败并继续失败。

    因此,我想我将不得不弄清楚如何将其转换为LaunchAgent。

    最佳答案

    答案是你不要。您不再在OSX上为要编写的应用程序使用cron。相反,请切换到LaunchAgent。当然,Apple一直在为POSIX支持提供支持,因此可能会保留很长时间,但是即使他们的网站也鼓励人们不再使用cron进行应用程序编码。

    "Note: Although it is still supported, cron is not a recommendedsolution. It has been deprecated in favor of launchd."

    SOURCE: https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html


    但是,不幸的是,LaunchAgents尚不支持cron风格的语法(至少在10.11.4中)。 (是的,我已经为您向苹果提出了建议。)因此,没有使用破折号,逗号或反斜杠。相反,它仅支持一个整数和多个块来创建每个时间范围。如果这还不够合适,请至少设置最短的时间范围,然后在您要启动的任何内容中执行其余代码,例如,如果您只想在该月的第一个星期一运行某个代码, LaunchDaemon在前7天启动,但如果不是当月的第一个星期一,则您的应用程序将关闭。

    关于objective-c - 通过OSX Cron运行时,Objective C命令失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36619811/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com