Приложение не запускается при перезагрузке системы

Я создал сервис LaunchDaemon, который запускает приложение

sudo launchctl load /Library/LaunchDaemons/com.testapp.plist

Вот мой com.testapp.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.testapp</string>
    <key>OnDemand</key>
    <false/>
    <key>UserName</key>
    <string>root</string>
    <key>GroupName</key>
    <string>wheel</string>
    <key>KeepAlive</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/var/log/OutputLog1.log</string>
    <key>StandardOutPath</key>
    <string>/var/log/OutputLog2.log</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/TestApplication/Test.app/Contents/MacOS/Test</string>
    </array>
</dict>
</plist>

Работает нормально. Но когда я перезагружаю свою систему, launchdaemon запускает мое приложение, но оно убивает приложение.

Журнал, который я получаю в консоли,

20/03/17 7:15:25.239 PM Test[50]: Untrusted apps are not allowed to connect to Window Server before login.
20/03/17 7:15:25.239 PM Test[50]: Set a breakpoint at CGSLogError to catch errors as they are logged.
20/03/17 7:15:25.239 PM Test[50]: On-demand launch of the Window Server is allowed for root user only.
20/03/17 7:15:25.239 PM Test[50]: CGSLookupServerRootPort: Failed to look up the port for "com.apple.windowserver.active" (1102)
20/03/17 7:15:25.239 PM Test[50]: On-demand launch of the Window Server is allowed for root user only.
20/03/17 7:15:25.239 PM Test[50]: CGSLookupServerRootPort: Failed to look up the port for "com.apple.windowserver.active" (1102)
20/03/17 7:15:25.239 PM Test[50]: This user is not allowed access to the window system right now.
20/03/17 7:15:34.721 PM Test[50]: RegisterApplication(), FAILED TO establish the default connection to the WindowServer, CGSDefaultConnection() is NULL.
20/03/17 7:15:34.732 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.732 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.735 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.735 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.735 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.736 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.736 PM Test[50]: Invalid Connection ID 0
20/03/17 7:15:34.970 PM Test[50]: CGSLookupServerRootPort: Failed to look up the port for "com.apple.windowserver.active" (1102)
20/03/17 7:15:34.970 PM Test[50]: CGSLookupServerRootPort: Failed to look up the port for "com.apple.windowserver.active" (1102)
20/03/17 7:15:34.970 PM Test[50]: CGSLookupServerRootPort: Failed to look up the port for "com.apple.windowserver.active" (1102)
20/03/17 7:15:34.972 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.972 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.972 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.976 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.
20/03/17 7:15:34.977 PM Test[50]: CGSConnectionByID: 0 is not a valid connection ID.

Я также проверил состояние запущенного приложения из Activity Monitor, который показывает, что приложение запущено.

Также проверил состояние демона

sudo launchctl list | grep testapp

который также показывает, что демон также работает.

Кроме того, ниже приведен мой журнал stdout от daemon plist (он записывает журнал, который я сделал в своем приложении):

2017-03-27 18:04:34.841 Test[802:16596] Application Started...
2017-03-27 18:04:34.896 Test[802:16596] argc : 1
2017-03-27 18:04:35.123 Test[802:16596] applicationWillFinishLaunching...
2017-03-27 18:04:35.145 Test[802:16596] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data
2017-03-27 18:04:35.146 Test[802:16596] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data
2017-03-27 18:04:35.147 Test[802:16596] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data
2017-03-27 18:04:35.148 Test[802:16596] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data
2017-03-27 18:04:35.224 Test[802:16596] applicationDidFinishLaunching...
2017-03-27 18:04:35.238 Test[802:16596] applicationDidChangeOcclusionState...
2017-03-27 18:04:35.253 Test[802:16596] applicationDidChangeOcclusionState...
2017-03-27 18:05:13.000 Test[820:17234] Application Started...
2017-03-27 18:05:13.072 Test[820:17234] argc : 1
2017-03-27 18:06:09.566 Test[92:505] Application Started...
_RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL.
2017-03-27 18:06:17.845 Test[92:505] argc : 1
2017-03-27 18:06:18.254 Test[92:505] applicationWillFinishLaunching...
2017-03-27 18:06:18.299 Test[92:505] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data
2017-03-27 18:06:18.300 Test[92:505] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data
2017-03-27 18:06:18.300 Test[92:505] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data
2017-03-27 18:06:18.302 Test[92:505] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data
2017-03-27 18:06:22.918 Test[92:505] In -[NSApplication(NSQuietSafeQuit) _updateCanQuitQuietlyAndSafely], _LSSetApplicationInformationItem(NSCanQuitQuietlyAndSafely) returned error -600

Я не могу получить основную причину этой проблемы.

Пожалуйста помоги.

Заранее спасибо.

1 ответ

Как показывает этот ответ, сообщение об ошибке:

Ненадежные приложения не могут подключаться к Window Server до входа в систему.

вводит в заблуждение, так как предполагает, что проблема связана с доверием, тогда как в действительности проблема заключается в том, что вы пытаетесь выполнить операции с графическим интерфейсом в неправильном контексте.

Демоны запуска работают в системном контексте независимо от того, могут ли пользователи войти в систему, и, возможно, до того, как пользователи войдут в систему, и не имеют доступа к серверу окон - они не могут представить пользовательский интерфейс.

Вкратце: если ваше приложение представляет пользовательский интерфейс, оно не может работать как демон.

В отличие от запуска агентов (загружается из /Library/LaunchAgents а также ~/Library/LaunchAgents Apple может представить графический интерфейс, Apple рекомендует против этого.

Возможно, все, что вам нужно, - это создать элемент входа, хотя вам придется создавать его для каждого пользователя.

Для обзора различных способов запуска приложения каждый раз, когда пользователь входит в систему, см. Мой ответ.

Другие вопросы по тегам