2016-04-14 1 views
1

Я закодировал автономное приложение команды Objective C. Если я запускаю его через LaunchDaemon, он отлично работает при подключении клиентским приложением ObjC через связь DistriutedObjects. Если я запустил его в командной строке, он работает нормально. Если я запускаю его при вызове с помощью скрипта Bash, он работает нормально. Тем не менее, по-разному, что я попытался бежать это через кронтаб привилегированного пользователя, он делает сбой отчет о распределении указателя:Командная строка Objective C при запуске через OSX Cron

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, как это делает '/Applications/My App.app/Contents/Resources/mytoolcommand' /q /sched

Я даже сделал вариацию где хроны называемой моим mytoolcommand.sh сценарий и просто написал Hello World для /tmp/out.txt, и все прошло отлично. Итак, я знаю, что мой crontab работает.

Можете ли вы помочь мне выяснить, что я делаю неправильно? Некоторые предполагаемые возможные проблемы:

  • Возможно, OSX El Capitan по какой-то причине закрывает мое приложение, например, неправильно подписывается. (Я отлаживаю прямо сейчас, у меня никогда не возникало проблем с подписью, если только он не обрабатывал папки .app. Кроме того, я могу просто запустить его из командной строки без предупреждения подписи.)

  • У меня есть отладка загрузка сообщений с основного() сразу с места в карьер. Они должны писать в /var/log/system.log, но это не так. Это говорит о том, что приложение сбой немедленно при вызове cron. Итак, есть ли что-то особенное, которое мне нужно загружать в библиотеки моего приложения, чтобы оно нормально работало при вызове cron?

РАЗРАБОТКИ

Я подозревал, что El Capitan привратника может быть причиной. Итак, я создал упрощенное консольное приложение Objective C, например, в файле main.mm и скомпилировано.

#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.

+0

Это 'cron' crashing (предполагается, что это копия« fork'ed »), а не ваша программа. Это трудно решить. Я также думал бы, что 'cron' устарел под OSX? Также что с аргументами '/ q' и'/sched'? – trojanfoe

+0

Хорошо, так что это cron. Возможно, cron не может обрабатывать загрузку приложения Objective C, только приложения C или C++ с низкими требованиями к памяти./Q и/sched являются аргументами, переданными моему Obj C-приложению для «быстрого сканирования по расписанию» - это вредоносный сканер, над которым я работаю, используя сторонний API. Cron не точно устарел - в файлах человека это пока не упоминается. OSX также хочет быть совместимым с POSIX, и cron является частью этого. Я больше привык к cron, чем LaunchDaemon. Релевантно: http://apple.stackexchange.com/a/96883/6907 – Volomike

+0

Мне нечего предложить. Я сомневаюсь, что «cron» заботится о том, на каком языке написана программа, однако если программа не использует Cocoa (т.е. приложение UI), то я вижу мало необходимости использовать Objective-C, и если вы используете Foundation, вам нужно управлять runloop (= hassle). Также '/' используется только в программах Windows для передачи аргументов; в UNIX-подобных системах это '-'. Я был бы наиболее встревожен как пользователь, если бы я ожидал использовать '/' для передачи аргументов в программе Mac. – trojanfoe

ответ

0

Ответ: НЕ ВЫ НЕ. Вы больше не используете cron для OSX для своих приложений, которые вы кодируете.Вместо этого переключитесь на LaunchAgent. Конечно, Apple поддерживает его для поддержки POSIX и, следовательно, может поддерживать его в течение очень долгого времени, но даже их сайт поощряет людей больше не использовать cron для кодирования приложений.

«Примечание: Несмотря на то, что до сих пор поддерживаются, хроны не рекомендуется решения Это было устаревшие в пользу запуска программ.».

ИСТОЧНИК: еще https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html

К сожалению, хотя, LaunchAgents нет (в 10.11.4, по крайней мере) синтаксиса поддержки хрон стиле. (Да, я уже подал вам такое предложение для Apple.) Таким образом, нет необходимости использовать тире, запятую или обратную косую черту. Вместо этого он поддерживает только целочисленные и множественные блоки для создания каждого таймфрейма. И если это недостаточно подходит, то установите по крайней мере самые минимальные таймфреймы, а затем выполните остальную часть кода в том, что вы запускаете, чтобы, например, если вы хотите, чтобы что-то было запущено только в первый понедельник месяца, LaunchDaemon запускается в течение первых семи дней, но ваше приложение завершает работу, если это не первый понедельник месяца.

Смежные вопросы