Служба запуска Launchd не закрывается - PullRequest
1 голос
/ 13 марта 2012

У меня есть приложение, которое я хочу запустить как LaunchDaemon на OSX. Мой 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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>my.service</string>
    <key>ProgramArguments</key>
    <array>
        <string>/servertest/MyService</string>
        <string>-jvm</string>
        <string>server</string>
        <string>-nodetach</string>      
        <string>-outfile</string>
        <string>out.txt</string>
        <string>-errfile</string>
        <string>err.txt</string>
        <string>-verbose</string>
        <string>-debug</string>
        <string>-home</string>
        <string>/System/Library/Frameworks/JavaVM.framework/Home</string>
        <string>-cp</string>
        <string>./lib/hsqldb.jar:./lib/myservice-wrapper.jar:./lib/commons-daemon-1.0.8.jar</string>
        <string>my.service.DaemonMac</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/servertest/stderr.log</string>
    <key>StandardOutPath</key>
    <string>/servertest/stdout.log</string>
    <key>WorkingDirectory</key>
    <string>/servertest</string>
</dict>
</plist>

Служба запускается при загрузке или при вызове 'launchctl start my.service'. Но не работает, когда я использую 'launchctl stop my.service' или даже выгружаю plist. Это остается в памяти и работает, как будто ничего не случилось. Понятия не имею, в чем может быть причина. Пожалуйста, помогите!

Ответы [ 2 ]

1 голос
/ 11 мая 2012

Файл, который работал для меня ниже.Я узнал, что мой демон не должен отрываться от процесса управления, и это должен быть «OnDemand», чтобы я мог остановить его, когда захочу.Я сделал несколько шаманских танцев, работая над этим, и хотя мне не ясно, в какой момент это начало работать.Теперь это так.

<?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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>myserver</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/MYServer/MYServer</string>
        <string>-server</string>
        <string>-outfile</string>
        <string>/opt/MYServer/out.txt</string>
        <string>-errfile</string>
        <string>/opt/MYServer/err.txt</string>
        <string>-verbose</string>
        <string>-debug</string>
        <string>-nodetach</string>
        <string>-home</string>
        <string>/System/Library/Frameworks/JavaVM.framework/Home</string>
        <string>-cp</string>
        <string>/opt/MYServer/lib/hsqldb.jar:/opt/MYServer/lib/my-wrapper.jar:/opt/MYServer/lib/commons-daemon-1.0.8.jar</string>
        <string>my.service.DaemonMac</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/opt/MYServer/stderr.log</string>
    <key>StandardOutPath</key>
    <string>/opt/MYServer/stdout.log</string>
    <key>WorkingDirectory</key>
    <string>/opt/MYServer</string>
</dict>
</plist>
1 голос
/ 13 марта 2012

Ваше приложение демонизирует себя (то есть уходит в фон)? Если это так, то он по существу отсоединяется от launchd и, следовательно, не позволяет launchd управлять им.

РЕДАКТИРОВАТЬ: если приложение не демонизирует себя, следующая вещь, на которую нужно обратить внимание, это посмотреть, что, как думает launchd, происходит с launchctl list my.service. Это должно вывести список свойств демона, включая его PID (если launchd считает, что он работает) и LastExitStatus (независимо от того, был ли он успешно завершен в прошлый раз). Соответствует ли PID фактическому действующему процессу? Изменяется ли результат при попытке остановить службу (особенно если PID меняется на 0)? Показывает ли список процессов (например, с ps -axj) какие-либо дочерние процессы, живущие после выхода из родительского процесса?

Да, и просто для уверенности: при управлении LaunchDaemons вам нужно использовать sudo launchctl (без sudo launchctl будет пытаться управлять агентами LaunchAgents в вашей пользовательской сессии).

...