2016-04-14 12 views
1

私はスタンドアロン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に変換する方法を理解しなければならないと思います。

+0

それはあなたのプログラムではなく、 'cron'クラッシュです(私が想定している' fork'コピー)。それは解決するのが難しいようです。私は 'cron'がOSXでは非難されていると思ったでしょうか? '/ q'と'/sched'の引数には何がありますか? – trojanfoe

+0

さて、それは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

+0

私はあまりお勧めできません。私は 'cron'がプログラムの言語を気にかけているとは思っていませんが、プログラムがCocoa(UIアプリケーション)を使用していない場合、Objective-Cを使う必要はほとんどなく、Foundationを使用している場合は、ランループ(=面倒)。また、 '/'は引数を渡すためのWindowsプログラムでのみ使用されます。 UNIX系のシステムでは '-'です。私は '/'を使ってMacプログラムで引数を渡すことが期待されていれば、ユーザーとしては非常に気になります。 – trojanfoe

答えて

0

答えはあなたではありません。コーディングしているアプリケーションでは、OSXではcronを使用しません。代わりにLaunchAgentに切り替えます。確かに、AppleはPOSIXサポートのためにそれを保持しているので、非常に長い間それを保つかもしれませんが、彼らのウェブサイトでさえ、人々がアプリケーションコーディングのためにcronを使わなくなるように勧めています。

「注意:それはまだサポートされていますが、cronが推奨さ ソリューションではありませんそれはlaunchdのの賛成で廃止されました。」

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

残念ながら、しかし、のLaunchAgentsんまだ(10.11.4で少なくとも)をサポートするcronスタイルの構文。 (ええ、私はすでにあなたのためにその提案をアップルに提出しています。)だから、ダッシュ、コンマ、またはバックスラッシュを使用していません。代わりに、各時間枠を作成するために整数と複数のブロックのみをサポートしています。それが十分でない場合は、最低でも最低限の時間枠を設定してから、コードの残りの部分を実行してください。例えば、月の最初の月曜日に何かを実行したい場合は、 LaunchDaemonは最初の7日間に起動しますが、月の最初の月曜日でない場合は、アプリケーションがシャットダウンします。

関連する問題