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.