私はスタンドアロンObjective Cコマンドアプリケーションをコーディングしました。 LaunchDaemonを介して実行すると、DistriutedObjects通信を介してObjCクライアントアプリケーションによって接続されたときにうまく動作します。私がコマンドラインで実行すると、うまく動作します。 Bashスクリプトで呼び出されたときに実行すると、正常に動作します。しかし、私はrootユーザのcrontabを介してこれを実行しようとしてきたさまざまな方法で、それがポインタの割り当てに関するクラッシュレポートを行います。OSX Cronを通して実行するとObjective Cコマンドが失敗する
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が私のコマンドを呼び出そうとしたときのように、ポインタallocatに関するクラッシュレポートで直ちに終了しますイオン。
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
がそうであるように、私もcronのが私のmytoolcommand.shスクリプトと呼ばれるバリエーションを行なったし、単純にHello Worldのを書いた'/Applications/My App.app/Contents/Resources/mytoolcommand' /q /sched
ないとして、それは、うまく動作すること/tmp/out.txt、それは正常に走った。だから、私は自分のcrontabが動作していることを知っています。
私が間違っていることを理解するのに役立つことができますか?いくつかの疑いのある問題:
おそらく、OSX El Capitanは、適切に署名されていないなど、何らかの理由でアプリケーションをシャットダウンしています。 (私は今、デバッグをしています。私はシグネチャの問題が.appフォルダを扱わない限り前に出てきたことはありませんでした)さらに、署名の警告を出さずにコマンドラインからうまく実行できます。バットからmain()のメッセージがすぐに読み込まれます。彼らは/var/log/system.logに書き込むべきですが、そうではありません。これは、アプリケーションがcronによって呼び出されたときにすぐにクラッシュすることを示しています。それで、アプリケーションのライブラリにロードしてcronのもとで呼び出されたときに正しく動作するように特別なものがありますか?
DEVELOPMENTS
私はエルキャピタンゲートキーパーが原因であった可能性があると疑われます。ですから、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の問題のようには見えません。
私は離れて行く問題を持っていましたが、短くしかありません。私は、新しいプロジェクトでプロジェクトを再コンパイルし、ソースコードと設定をコピーしました。私はその後、問題なく約4回、cronを通してコマンドを実行しました。しかし、私が5回目に走ったとき、それは再び失敗し、失敗し続けました。
私はLaunchAgentに変換する方法を理解しなければならないと思います。
それはあなたのプログラムではなく、 'cron'クラッシュです(私が想定している' fork'コピー)。それは解決するのが難しいようです。私は 'cron'がOSXでは非難されていると思ったでしょうか? '/ q'と'/sched'の引数には何がありますか? – trojanfoe
さて、それはcronだから。おそらくcronはObjective Cアプリケーションのロードを処理できず、メモリ要件の低いCまたはC++アプリケーションのみを処理できます。/qと/ schedはObj Cアプリに渡された引数で、「スケジュールされたスキャンが速い」 - サードパーティのAPIを使用しているマルウェアスキャナです。 Cronは厳密に非難されているわけではありません。 OSXもPOSIXに準拠したいと思っています.cronもその一部です。私はまだLaunchDaemonのスケジュールよりもcronに慣れています。関連性:http://apple.stackexchange.com/a/96883/6907 – Volomike
私はあまりお勧めできません。私は 'cron'がプログラムの言語を気にかけているとは思っていませんが、プログラムがCocoa(UIアプリケーション)を使用していない場合、Objective-Cを使う必要はほとんどなく、Foundationを使用している場合は、ランループ(=面倒)。また、 '/'は引数を渡すためのWindowsプログラムでのみ使用されます。 UNIX系のシステムでは '-'です。私は '/'を使ってMacプログラムで引数を渡すことが期待されていれば、ユーザーとしては非常に気になります。 – trojanfoe