launchd를 사용하여 데몬 실행 또는 시작만

launchd를 사용하여 데몬 실행 또는 시작만

설정하려고 하는데YouTrackOS X Lion Server에서 launchd. 을 사용하여 명령줄에서 성공적으로 실행할 수 있는 YouTrack jar 파일을 다운로드했습니다 java -Xmx512m -jar youtrack.jar 8080. 또한 해당 실행 명령을 다음과 유사한 쉘 스크립트로 래핑했습니다.이것youtrack start기본적으로 및 를 사용하여 활성 인스턴스와 상호 작용할 수 있습니다 youtrack stop. java실행 중인 인스턴스를 중지하고 하나의 인스턴스만 허용하기 위해 프로세스 의 프로세스 ID를 파일에 저장 하고 종료합니다.

부팅 시 이 명령을 실행하기 위해 간단한 launchd plist를 만들어 에 제공된 지침에 따라 /Library/LaunchDaemons에 배치했습니다 man launchd.plist. 사용되는 주요 키는 ProgramArguments( youtrack start) 및 RunAtLoad(true)입니다. 문제는 명령줄을 실행하면 프로세스 youtrack start의 pid가 포함된 파일이 생성되고 이 프로세스를 또는 java에서 볼 수 있다는 것입니다 . 그러나 명령이 lanuchd( )에 의해 실행되는 경우 결과 pid는 실행 중인 프로세스의 pid와 일치하지 않으며 YouTrack 웹 서버가 시작되지 않습니다. launchd에 의해 시작된 Java 프로세스도 launchd가 완료되면 종료되는 것과 거의 같습니다.topps axsudo launchctl load /Library/LaunchDaemons/org.example.youtrack.plist

그러나 대신 java 명령을 launchd plist에 직접 넣으면 제대로 작동합니다. 나는 이것이 왜 그런지 이해하고 싶습니다. 나는 launchd의 아이디어가 데몬을 시작하는 것이라고 생각했습니다. 하지만 이는 데몬이 전체 수명 동안 launchd 내부에서 실행되어야 함을 의미합니까? launchd를 사용하거나 사용하지 않고 데몬을 시작하는 다른 방법이 있습니까? 부팅 시 한 번만 명령을 실행할 수 있습니까? 기본적으로 이전 버전의 OS X @roboot에서 사용했던 작업입니다 .cron

답변1

Launchd는 단지 프로그램을 시작하는 것이 아니라 프로그램이 실행되는 동안 모니터링합니다. 기본적으로 프로그램은 다른 프로그램(/백그라운드 복사본/무엇이든)을 시작하고 종료하지 않고 계속 실행(데몬으로)할 것으로 예상합니다. 프로그램이 종료되면 launchd는 실행 및 종료 프로그램에 문제를 일으킬 수 있는 두 가지 작업을 수행합니다. 즉 youtrack start, 남은 하위 프로세스(예: 실제 서버 프로세스)를 "정리"하고 (다른 설정에 따라) 아마도 "실패한" 프로그램을 다시 시도하십시오. 이 문제를 해결하는 방법에는 두 가지가 있습니다.

  1. launchd 방식으로 실행하십시오. launchd 항목을 java -Xmx512m -jar youtrack.jar 8080직접 실행하십시오(명령의 각 "단어"는 배열의 별도 요소여야 합니다 ProgramArguments). launchd .plist에 추가하면 <key>KeepAlive</key><true/>어떤 이유로든 서버가 충돌하거나 종료되면 서버가 다시 시작됩니다(여기에는 종료되는 것도 포함되므로 youtrack stop사용하도록 다시 작성 launchctl unload ...하고 launchd에서 종료하도록 해야 합니다).

  2. launchd에게 계속 실행될 것으로 예상하지 말고 하위 프로세스를 종료하지 말라고 지시합니다. 기본 동작을 끄려면 .plist에 다음을 추가하세요.

    <key>KeepAlive</key>
    <false/>
    <key>AbandonProcessGroup</key>
    <true/>
    

관련 정보