Yosemite에서 launchctl을 사용하여 데몬을 시작할 수 없습니다


27

~/Library/LaunchAgents매버릭스에서 잘 작동 하는 시작 데몬이 있습니다. 그러나 요세미티 공개 베타 버전에서는 시작되지 않습니다. 데몬 plist는 다음과 같습니다 (사용자 이름은 darksairUID 501입니다)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

기본적으로 ~/bin/retrmail.py5 분마다 실행 됩니다.

Yosemite에서 launchd가 2.0으로 업그레이드되었으며 launchctl에 새로운 명령이 있음을 알았습니다. 나는 시도했다

sudo launchctl kickstart user/501/org.darksair.retrmail

그리고 그것은 말했다

Could not find service "org.darksair.retrmail" in domain for uid: 501

나는 또한 오래된 학교를 시도

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

그리고 그것은 말했다

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

이 파일은 나와 직원 그룹이 소유합니다. 동일한 오류로 권한 644와 600을 모두 시도했습니다.

요세미티에서 시작된 데몬을 올바르게 시작하는 방법을 아는 사람이 있습니까?


업데이트 : 내 시작 에이전트 파일을 소유해야합니다 root:wheel. 나는 질식 후 시도

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

오류가 발생하지 않았습니다. 그리고 내 악마가 제대로 돌아가고 있다고 생각 합니다. 시작된 문서에 데몬을 실행하는 사용자가 시작 에이전트 파일을 소유 할 수 있음을 명확하게 기억하고 있으므로이 질문을 열어 두겠습니다.


UPDATE2 : 아니요 제대로 실행되지 않았습니다. 마치 언로드 된 것처럼 한 번만 실행되었지만 다시는 실행되지 않았습니다.


업데이트 3 : 요세미티 공개 베타 3으로 업그레이드하고 에이전트를 다음과 같이 변경했습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

이 에이전트를 다시로드했는데 이제 제대로 작동한다고 생각합니다. 이전 plist에 어떤 문제가 있는지 모르기 때문에 여전히이 질문을 열어두고 있습니다.


결론적으로, 내가 찾은 것은 plist root:wheel를로드하기 위해 plist의 소유자를 변경해야한다는 것입니다.


이 요세미티에서 작동합니까?
— TJ Luoma

@TJLuoma : 예. plist가 root : wheel이 소유하는 한.
— MetroWind

답변:


21

에서 man launchctl

사용자 별 구성 파일 (LaunchAgents)은 루트 (/ Library / LaunchAgents에있는 경우) 또는이를로드하는 사용자 ($ HOME / Library / LaunchAgents에있는 경우)가 소유해야합니다. 모든 시스템 데몬 (LaunchDaemons)은 루트가 소유해야합니다. 구성 파일은 그룹 및 월드 쓰기를 허용하지 않아야합니다. 실행 된 구성 파일에 대한 쓰기 기능을 허용하면 실행할 실행 파일을 지정할 수 있으므로 보안상의 이유로 이러한 제한 사항이 적용됩니다.

수정

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist

2
"또는 사용자가로드하는 중"<— 이것이 문제가되는 부분입니다.
— MetroWind

2
나는 유닉스 사람이 아니지만 "그룹 및 세계 쓰기 금지"라고 말합니다. 여전히 읽을 필요가 있기 때문에 그렇게해서는 안됩니다 chmod 644.
— Jason

5

이상하게도 사용하는 sudo것이 문제였습니다. 를 사용 sudo하면 더 이상 자신이 아니므로 자신의 파일 소유자가 아닙니다. 를 제거 sudo하고 명령을 반복하면 제대로로드됩니다. 모든 것에 대한 철학적 접근에 대해 죄송합니다.


4

해결책을 찾았습니다.

이 경우 올바른 명령은

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

그리고 언로드하기 위해

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

왜 launchctl load루트 가 필요한지 모르지만로드 / 언로드는 더 이상 사용되지 않습니다.


매뉴얼 페이지는 부팅이 아닌 부팅을 나열합니다. 내 컴퓨터에서 부팅을 부팅 컷으로 변경 한 이후 자동 수정을 사용했다고 생각합니다.
— Steve Moser

@MetroWind 위의 명령으로 Code = 112 오류의 도메인을 찾을 수 없습니다. 일관성이 없습니다. 어떤 단서?
— Parag Bafna

아직도 chmod& 가 필요 했습니까 chown?
— Itachi

@ 이타치 기본 소유자와 권한을 그대로 두는 것이 좋습니다.
— MetroWind

@ParagBafna, 확실하지 않습니다. 아마 UID가 501이 아니십니까?
— MetroWind

3

루트 소유 .plist가 아닌 사용자를 사용하려고 시도했습니다 (가능한 한해 야 함).

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

콘솔 (헤드리스)에 로그인하지 않은 상태 에서이 컴퓨터에 원격으로 ssh-ed되었습니다. 최소한 사용자 관리 서비스는 사용자가 기본 화면에 로그인해야합니다. 헤드리스 시스템이므로 원격 관리를 통해 로그인)

IMO, 개인적으로 로그인하지 않아도 옵션을 실행하려는 경우 다음을 수행하십시오.

  • 계정 로그인을 자동으로 만드십시오 (대답 중 하나에 언급 된대로 UserName 태그없이 보안에 유의하십시오)

  • 다양한 제안에서 언급 한대로 파일을 루트 소유로 만듭니다 (이미 보유한 UserName으로 사용자를 효과적으로 다시 설정)


2
정말 고맙습니다. 귀하의 답변에서 해결책을 찾았습니다.
— Retraut

2

바보 같은 생각이 있습니다.

요세미티로 업그레이드 한 후에도 같은 오류가 발생했습니다. 실제로 plist 파일에서 참조하는 바이너리 (내 경우에는 cassandra)가 실행 파일을 잃어 버렸을 때 .plist 파일에 대한 소유권 / 권한이 잘못되었다고 잘못 생각했습니다.

chmod + x로 수정했습니다.

아마 당신의 문제는 아니지만 기회가 될 것입니다 :)


이것은 나의 경우에는 적용되지 않습니다. 내 실행 파일에는 x 권한 비트가 있습니다. 그러나 어쨌든 대답 주셔서 감사합니다. 다른 사람들에게 도움이되기를 바랍니다.
— MetroWind

2

UserName키와 문자열을 제거하십시오 .

문제는 UserName프로세스가 루트로 시작된 경우에만 키를 사용할 수 있다는 것입니다. plist가 root에 의해 소유 된 경우에만 루트로 시작할 수 있습니다. 기본적으로 프로세스는 루트로 시작된 다음 지정된 사용자에게 suid'ed됩니다. 이 프로세스를 직접 실행하려면 ~ / Library / LaunchAgents 폴더에 plist를 넣고 UserName 키를 제거하십시오.


zabbix_agend에 대한 'UserName'옵션을 제거한 후 작동합니다. 고맙습니다! - gist.github.com/chusiang/04db38f5173784e33b68
— 추 - saing 높은 라이

이상… "UserName"항목을 제거한 후에도 여전히로드되지 않습니다…
— MetroWind

1

사용자 권한이있는 에이전트를 수동으로 다시로드하려고 했습니까? 왜 이것이 필요한지 완전히 이해하지 못하지만 사용자 도메인에 연결해야한다고 생각합니다 (루트로 실행할 때 연결되지 않은 것 같습니다). 이 기능을 사용하여 다시 연결하면 나에게 도움이되었습니다.

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="sudo launchctl bsexec $user_pid sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

다음과 같이 사용하십시오.

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

bsexec를 사용하면 도메인으로 돌아가서 작업을 사용자 런치 에이전트로 추가 할 수 있습니다.


/Users/darksair/Library/LaunchAgents/retrmail.plist : 작업이 이미 진행 중입니다. 이 시점에서 내 질문은 기본적으로 : 왜 킥 스타트 명령이 작동하지 않았습니까? 왜 plist 소유권을 root로 설정해야합니까?
— MetroWind

1
plist 파일의 소유자를 루트로 설정해서는 안됩니다. ~ / Library / LaunchAgents의 모든 항목은 해당 디렉토리가 속한 사용자가 소유해야합니다. 명령을로드하기 전에 언로드하지 않으면 작업이 이미 진행 중입니다. 내가 제공 한 기능을 사용하고 있습니까?
— imalison

예. 나는 당신의 기능을 사용하고있었습니다. 그리고 plist를 먼저 언로드했습니다…
— MetroWind

방금 제공 한 첫 번째 plist를로드하려고 시도했지만 저에게 효과적이었습니다. 파일에 어떤 권한이 설정되어 있습니까?
— imalison

이것은 많은 것들을위한 놀라운 코드입니다. 꼭두각시와 커스텀 bash 스크립트를 혼합하여 다양한 macOS 장치를 관리하고 있으며 보안 감사 세션이나 사용자 도메인이 정확하지 않기 때문에 임의의 문제가 발생합니다. 훌륭한 일!
— Andrew White
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.