Não é possível iniciar o daemon com o launchctl no Yosemite

25

Eu tenho um daemon launchd colocado em ~/Library/LaunchAgents que funcionou bem no Mavericks. Mas não começará no beta público de Yosemite. O daemon plist é assim (meu nome de usuário é darksair com o UID 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>

Basicamente, ele deve executar ~/bin/retrmail.py a cada 5 minutos.

Noto que no Yosemite o launchd é atualizado para o 2.0 e o launchctl tem novos comandos. Eu tentei

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

e disse

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

Eu também tentei a velha escola

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

e disse

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

O arquivo é de minha propriedade e do grupo de funcionários. Eu tentei as duas permissões 644 e 600 com o mesmo erro.

Alguém sabe como acionar corretamente um daemon launchd em Yosemite?

UPDATE: parece que meu arquivo do agente de lançamento precisa ser de propriedade de root:wheel . Depois que eu chown, eu tentei

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

e não apresentou nenhum erro. E eu acho que meu deamon está funcionando corretamente. Deixarei essa questão em aberto porque lembro que o documento de lançamento afirma claramente que o arquivo do agente de lançamento pode ser de propriedade do usuário que está executando o daemon.

UPDATE2: não, não estava funcionando corretamente. Ele foi executado apenas uma vez, mas não novamente, como se estivesse descarregado.

UPDATE3: fiz o upgrade para o beta 3 público do Yosemite e mudei meu agente para esse

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

Eu recarreguei este agente e acho que agora ele está funcionando corretamente. Ainda deixo essa questão em aberto porque não sei o que há de errado com meu problema anterior.

Em conclusão, o que eu encontrei é que eu tenho que mudar o dono do plist para root:wheel para poder carregá-lo.

    
por MetroWind 07.08.2014 / 20:43

7 respostas

4

Encontrou a solução.

O comando correto neste caso é

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

E para descarregar,

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

Não sei porque launchctl load requer raiz, mas o carregamento / descarregamento está obsoleto de qualquer forma.

    
por 05.12.2016 / 23:40
21

De man launchctl

Note that per-user configuration files (LaunchAgents) must be owned by root (if they are located in /Library/LaunchAgents) or the user loading them (if they are located in $HOME/Library/LaunchAgents). All system-wide daemons (LaunchDaemons) must be owned by root. Configuration files must disallow group and world writes. These restrictions are in place for security reasons, as allowing writability to a launchd configuration file allows one to specify which executable will be launched.

Corrigir é

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist
    
por 28.10.2014 / 10:51
5

Curiosamente, usar sudo foi o seu problema. Ao usar sudo , você não era mais você mesmo, então você não era o proprietário do seu próprio arquivo. Remova sudo , repita o comando e ele deve carregar bem. Desculpe pela abordagem filosófica de tudo isso.

    
por 06.04.2015 / 01:51
2

Remova a chave e a string UserName .

O problema é que a chave UserName só pode ser usada se o processo for iniciado pelo root. Ele só pode ser iniciado como root se o plist for de propriedade root. Basicamente, o processo é iniciado pelo root e depois é suidado para o usuário especificado. Se você quiser que este processo seja executado como você mesmo, coloque o plist na pasta ~ / Library / LaunchAgents e remova a chave UserName.

    
por 01.10.2015 / 14:57
1

Aqui está uma ideia boba.

Acabei de ter o mesmo erro, também depois de ter atualizado para o Yosemite. Eu presumi erroneamente que significava propriedade / permissões ruins no arquivo .plist, quando, de fato, por algum motivo, o binário que eu estava referenciando no plist (no meu caso cassandra), tinha perdido seu bit executável.

chmod + xing corrigiu isso.

Provavelmente não é problema seu, mas pode valer uma chance:)

    
por 20.08.2014 / 13:15
1

Você estava tentando recarregar manualmente um agente que tinha permissões de usuário? Eu não entendo inteiramente porque isso é necessário, mas acredito que você precisa estar conectado ao seu domínio de usuários (o que parece que você não está conectado quando você executa como root). Usar essas funções para reconectar funcionou para mim.

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \;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"
}

Você usaria isso da seguinte maneira:

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

O bsexec coloca você de volta em seu domínio e permite que você adicione a tarefa como agente de inicialização do usuário.

    
por 21.10.2014 / 21:33
1

Corri para isso também, tentando usar o usuário, não o root .plist (como deve ser possível fazer)

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

Eu estava ssh-ed nesta máquina remotamente enquanto eu não estava logado no console (headless) que parecia ser o meu problema - pelo menos as necessidades de serviços gerenciados pelo usuário que o usuário está logado na tela principal (I acabou fazendo loggin-in via gerenciamento remoto, já que esta é uma máquina sem cabeçalho)

IMO, se você quiser que isso seja executado, mesmo que você não esteja lá para fazer login, suas opções são:

  • Faça login da sua conta automaticamente (observe a implicação de segurança, também sem a tag UserName, conforme observado em uma das respostas)

  • Faça com que os arquivos possuam raiz, conforme indicado nas várias sugestões (configure o usuário para o seu com UserName como você já possui)

por 11.05.2016 / 16:32