2011-09-19 1 views
0

Je suis en train de mettre en place un LaunchAgent local pour cassandra et je suis en cours d'exécution dans un problème puisque bin/cassandra est un script shell qui lance:OSX LaunchAgent pour l'application qui lance une autre application

/usr/bin/java -ea -javaagent:blah blah blah blah blah blah blah 

Mon LaunchAgent lance le script mais ne lance jamais cassandra ou ne lui permet pas d'engendrer des sous-processus, ou, bien je ne suis pas tout à fait sûr de ce qui se passe mais il semble que j'ai déjà rencontré ce problème. La seule façon que je connaisse pour obtenir ce travail est de changer mon LaunchAgent de:

<?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.cassandra.agent</string> 

    <key>RunAtLoad</key> 
    <true/> 

    <key>KeepAlive</key> 
    <true/> 

    <key>UserName</key> 
    <string>root</string> 

    <key>ProgramArguments</key> 
    <array> 
     <string>/path/to/cassandra/bin/cassandra</string> 
    </array> 

    <key>WorkingDirectory</key> 
    <string>/path/to/cassandra/bin</string> 
</dict> 
</plist> 

à ...

... 
<key>ProgramArguments</key> 
<array> 
    <string>/usr/bin/java</string> 
    <string>-ea</string> 
    <string>-javaagent:blah</string> 
    <string>blah</string> 
    <string>blah</string> 
    <string>blah</string> 
    <string>blah</string> 
    <string>blah</string> 
    <string>blah</string> 
</array> 

Je me demande si quelqu'un sait comment je peux faire référence à la coquille script du LaunchAgent au lieu de tirer tous les arguments de ps aux

+0

Avez-vous essayé d'ajouter le script shell avec un binaire shell réel qui doit exécuter le script, c'est-à-dire/bin/sh? –

+0

@tommyd - bonne idée, mais pas de chance :(Même chose - une vérification immédiate montre le processus '/ bin/sh/chemin/à/bin/cassandra' mais quelques ms plus tard et le processus est parti –

Répondre

1

Je ne suis pas spécifiquement familier avec cassandra, mais je suppose qu'il est démonisant lui-même (c'est-à-dire se laissant tomber en arrière-plan). launchd n'aime pas que ses enfants se démonisent eux-mêmes; il s'attend alors à rester au premier plan où il peut garder un œil sur eux. Si on se démonise, launchd pense qu'il est terminé (ce qui, techniquement, il l'a fait), nettoie tous les sous-processus restants (y compris le processus maintenant démonisé), et le relance. Mousser, rincer, répéter.

Selon this entry in the cassandra wiki, vous pouvez passer cassandra le drapeau -f pour le faire rester au premier plan, et de garder launchd heureux:

<key>ProgramArguments</key> 
<array> 
    <string>/opt/local/bin/cassandra</string> 
    <string>-f</string> 
</array> 
+0

Accepter pour le répondre, +1 pour l'explication qui est plus utile à long terme :) –

Questions connexes