1

我创建了一个运行应用程序的 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

这也表明守护进程也在运行。

此外,下面是来自守护进程 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

我无法得到这个问题的主要原因。

请帮忙。

提前致谢。

4

1 回答 1

1

正如这个答案所示,错误消息:

登录前不允许不受信任的应用程序连接到 Window Server。

具有误导性,因为它暗示问题是信任问题之一,而实际上问题是您正在尝试从错误的上下文进行GUI操作。

启动守护程序独立于任何用户登录之前在系统上下文中运行,并且可能在任何用户登录之前运行,并且无法访问 Window Server - 它们无法呈现 UI。

简而言之:如果您的应用程序呈现用户界面,它就不能作为守护进程运行。

相比之下,启动代理/Library/LaunchAgents(从和加载~/Library/LaunchAgents)能够呈现 GUI,Apple 不建议这样做

也许您所需要的只是创建一个登录项,尽管您必须在每个用户的基础上创建它。

有关用户登录时运行应用程序的各种方法的概述,请参阅我的这个答案

于 2017-03-26T02:33:53.700 回答