2017-03-22 8 views
1

J'ai créé un service de LaunchDaemon qui exécute une applicationapplication ne démarre pas sur le système reboot

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

Voici mon 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> 

Il fonctionne très bien. Mais quand je redémarre mon système, launchdaemon démarre mon application mais elle tue l'application.

journal que je reçois dans la console est,

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. 

J'ai aussi vérifié l'application état de fonctionnement du moniteur d'activité qui montre que l'application fonctionne.

a également vérifié l'état du démon par

sudo launchctl list | grep testapp 

qui montre également que le démon est également en cours d'exécution.

également, ci-dessous est mon journal stdout du démon plist (Il enregistre le journal que je l'ai fait dans ma demande):

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 

Je ne suis pas en mesure d'obtenir la principale cause de ce problème.

Aidez-nous s'il vous plaît.

Merci d'avance.

Répondre

1

Comme this answer montre, le message d'erreur:

des applications non approuvées ne sont pas autorisés à se connecter à Windows Server avant la connexion.

est trompeur en ce qu'il suggère le problème est l'un des confiance, alors qu'en réalité le problème est que vous essayez GUI opérations du mauvais contexte.

Lancez démons exécutez dans un contexte système indépendamment de et potentiellement avant que les utilisateurs ne se connectent, et n'ont pas accès au serveur de fenêtres - ils ne peuvent pas présenter une interface utilisateur.

En résumé: Si votre application présente une interface utilisateur, elle ne peut pas fonctionner comme démon .

En revanche, lancer agents (chargés de /Library/LaunchAgents et ~/Library/LaunchAgents) sont capables de présenter une interface graphique, Apple recommends against it.

Peut-être que tout ce dont vous avez besoin est de créer un identifiant, bien que vous deviez le créer pour chaque utilisateur.

Pour un aperçu des différentes façons d'exécuter une application à chaque fois qu'un utilisateur se connecte, voir this answer.

+0

Merci et désolé mais pouvez-vous s'il vous plaît élaborer la même chose? En outre, je suis en train de mettre à jour ma question avec le journal de stdout à partir de démon daemon. –

+0

@ Akshada-Systematix: Voir si ma mise à jour aide. Que fait réellement votre application? A-t-il besoin de fonctionner en tant que root? A-t-il besoin de fonctionner pour chaque utilisateur du système? La meilleure méthode pour lancer votre application dépend des réponses à ces questions. – mklement0

+0

Le but de mon application est d'exécuter l'emplacement de la piste en arrière-plan et il devrait être indépendamment de tout utilisateur qui me mène vers launchdaemon. L'application sera cachée et ne sera pas visible par l'utilisateur. Pour le même, j'ai supprimé "Fenêtre" et "Menu principal" de mon application "MainMenu.xib". Également ajouté ci-dessous des lignes pour cacher mon application. ProcessSerialNumber psn = {0, kCurrentProcess}; TransformProcessType (& psn, kProcessTransformToBackgroundApplication); Pour cacher j'ai également essayé, LSUIElement S'il vous plaît aider. –