Я закодировал автономное приложение команды 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.
Это 'cron' crashing (предполагается, что это копия« fork'ed »), а не ваша программа. Это трудно решить. Я также думал бы, что 'cron' устарел под OSX? Также что с аргументами '/ q' и'/sched'? – trojanfoe
Хорошо, так что это 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
Мне нечего предложить. Я сомневаюсь, что «cron» заботится о том, на каком языке написана программа, однако если программа не использует Cocoa (т.е. приложение UI), то я вижу мало необходимости использовать Objective-C, и если вы используете Foundation, вам нужно управлять runloop (= hassle). Также '/' используется только в программах Windows для передачи аргументов; в UNIX-подобных системах это '-'. Я был бы наиболее встревожен как пользователь, если бы я ожидал использовать '/' для передачи аргументов в программе Mac. – trojanfoe