OSX LaunchAgent для приложения, которое запускает другое приложение

Я пытаюсь настроить локальный LaunchAgent для cassandra и столкнулся с проблемой, поскольку bin/cassandra — это просто сценарий оболочки, который запускает:

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

Мой LaunchAgent запускает скрипт, но либо никогда не запускает cassandra, либо не позволяет ему запускать подпроцессы, либо, ну, я не совсем уверен, что происходит, но, похоже, я сталкивался с этой проблемой раньше. Единственный известный мне способ заставить это работать - изменить мой LaunchAgent с:

<?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>

to...

...
<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>

Мне интересно, знает ли кто-нибудь, как я могу просто ссылаться на сценарий оболочки из LaunchAgent вместо того, чтобы извлекать все аргументы из ps aux


person Mark Kahn    schedule 19.09.2011    source источник
comment
Вы пытались добавить к сценарию оболочки фактический двоичный файл оболочки, который должен выполнять сценарий, то есть /bin/sh?   -  person Thomas Keller    schedule 20.09.2011
comment
@tommyd - хорошая идея, но не повезло :( То же самое - немедленная проверка показывает процесс /bin/sh /path/to/bin/cassandra, но через несколько мс процесс исчезает   -  person Mark Kahn    schedule 20.09.2011


Ответы (1)


Я не особо знаком с кассандрой, но я предполагаю, что она демонизирует себя (то есть уходит в фоновый режим). launchd не любит, когда его дети демонизируют себя; затем он рассчитывает оставаться на переднем плане, где он может следить за ними. Если кто-то демонизирует себя, launchd думает, что он вышел (что технически так и есть), очищает все оставшиеся подпроцессы (включая теперь демонизированный процесс) и перезапускает его. Вспеньте, промойте, повторите.

Согласно этой записи в вики cassandra, вы можете передать cassandra флаг -f, чтобы она оставалась в на переднем плане и держите launchd счастливым:

<key>ProgramArguments</key>
<array>
    <string>/opt/local/bin/cassandra</string>
    <string>-f</string>
</array>
person Gordon Davisson    schedule 19.09.2011
comment
Примите ответ, +1 за объяснение, которое более полезно в долгосрочной перспективе :) - person Mark Kahn; 20.09.2011