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

27

Eu tenho um daemon launchd ~/Library/LaunchAgentsque funcionou bem no Mavericks. Mas não começará na versão beta pública de Yosemite. O daemon plist é assim (meu nome de usuário está darksairno 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 ser executado a ~/bin/retrmail.pycada 5 minutos.

Percebo que no Yosemite, o launchd é atualizado para 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 pertence a mim e ao grupo de funcionários. Tentei as permissões 644 e 600 com o mesmo erro.

Alguém sabe como iniciar adequadamente um daemon launchd em Yosemite?


UPDATE: Parece que meu arquivo do agente de inicialização deve pertencer a root:wheel. Depois que chown, tentei

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

e não emitiu nenhum erro. E acho que meu deamon está funcionando corretamente. Deixarei essa pergunta em aberto porque lembro que o documento launchd indica claramente que o arquivo do agente de inicialização pode pertencer ao usuário que está executando o daemon.


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


UPDATE3: atualizei para o beta 3 público de Yosemite e mudei meu agente para este

<?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 esse agente e acho que agora está funcionando corretamente. Ainda estou deixando esta questão em aberto, porque não sei o que há de errado com meu argumento anterior.


Concluindo, o que descobri é que tenho que mudar o proprietário do plist para root:wheelpara carregá-lo.

MetroWind
fonte
Isso funciona na final de Yosemite?
TJ Luoma
@TJLuoma: sim. Desde que o plist seja de propriedade de root: wheel.
MetroWind

Respostas:

21

A partir de man launchctl

Observe que os arquivos de configuração por usuário (LaunchAgents) devem pertencer à raiz (se estiverem localizados em / Library / LaunchAgents) ou ao usuário que os carrega (se estiverem localizados em $ HOME / Library / LaunchAgents). Todos os daemons em todo o sistema (LaunchDaemons) devem pertencer à raiz. Os arquivos de configuração devem proibir gravações de grupo e mundo. Essas restrições existem por motivos de segurança, pois permitir a gravação em um arquivo de configuração launchd permite especificar qual executável será iniciado.

Fix is

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist
diimdeep
fonte
2
“Ou o usuário carregando-os” <- Esta é a parte com a qual tenho problemas.
MetroWind
2
Eu não sou um cara unix, mas diz "não permitir gravações em grupo e mundo". Uma vez que ainda pode precisar ser lido, não deveria chmod 644?
31414 Jason
5

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

AlexPantea
fonte
4

Encontrei 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

launchctl loadPorém, não sei por que requer raiz, mas o carregamento / descarregamento é preterido de qualquer maneira.

MetroWind
fonte
A página de manual lista a inicialização, não a inicialização. Eu acho que a autocorreção conseguiu você, pois na minha máquina ele muda a inicialização para o bootcut.
Steve Moser
@ MetroWind que estou recebendo Não foi possível encontrar o domínio para o erro Code = 112 com o comando acima. não é consistente. qualquer pista ?
Parag Bafna
Você ainda precisava do chmod& chown?
Itachi
@ Itachi, não. Deixar o proprietário e a permissão padrão deve ficar bem.
MetroWind 23/01
@ParagBafna, não tenho certeza. Talvez o seu UID não seja 501?
MetroWind 23/01
3

Também deparei com isso, tentando usar o usuário, e não o .plist de propriedade do root (como deveria ser possível)

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

Eu fui transferido para esta máquina remotamente enquanto NÃO estava conectado ao console (sem cabeça), o que parecia ser o meu problema - pelo menos os serviços gerenciados pelo usuário precisam que o usuário esteja conectado na tela principal (eu acabei fazendo log-in via gerenciamento remoto, pois esta é uma máquina sem cabeça)

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

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

  • Torne os arquivos como proprietários, conforme observado nas várias sugestões (configurando o usuário de volta ao seu com UserName como você já possui)

nhed
fonte
2
Muito obrigado. Encontrei solução na sua resposta.
Retraut
2

Aqui está uma ideia boba.

Eu apenas tive o mesmo erro, também depois de ter feito o upgrade para Yosemite. Eu assumi erroneamente que isso 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), havia perdido seu bit executável.

chmod + x'ing consertou.

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

DanielSmedegaardBuus
fonte
Isso não se aplica ao meu caso. Meu executável tem o bit de permissão x. Mas obrigado pela resposta de qualquer maneira. Espero que ajude outras pessoas.
MetroWind 24/08/14
2

Remova a UserNamechave e a string.

O problema é que a UserNamechave só pode ser usada se o processo for iniciado pela raiz. Só pode ser iniciado como root se o plist pertencer a root. Basicamente, o processo é iniciado pela raiz e, em seguida, é submetido ao usuário especificado. Se você deseja que esse processo seja executado como você, coloque o plist na pasta ~ / Library / LaunchAgents e remova a chave UserName.

Peter T Bosse II
fonte
Está funcionando depois que eu removo a opção 'UserName' para zabbix_agend. Obrigado! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai 15/15
Estranho ... Ele ainda não carrega depois que eu removi a coisa "UserName" ...
MetroWind 03/03
1

Você estava tentando recarregar manualmente um agente que tinha permissões de usuário? Não entendo por que tudo isso é necessário, mas acredito que você precisa estar conectado ao domínio de seus usuários (ao que parece não estar conectado ao executar como root). O uso dessas funções para reconectar funcionou para mim.

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"
}

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 adicionar a tarefa como um agente de inicialização do usuário.

Imalison
fonte
Ele diz: /Users/darksair/Library/LaunchAgents/retrmail.plist: operação já em andamento. Neste ponto, minhas perguntas são basicamente: por que o comando kickstart não funcionou? E por que tenho que definir a propriedade plist como root ...?
MetroWind 22/10
1
Você NÃO deve definir o proprietário do seu arquivo plist como root; tudo em ~ / Library / LaunchAgents deve pertencer ao usuário ao qual esse diretório pertence. Consegui a operação já em andamento quando não descarregei o comando antes de carregá-lo. Você está usando a função que eu forneci?
imalison
Sim. Eu estava usando suas funções. E eu descarreguei o plist primeiro ...
MetroWind 23/10/14
Eu apenas tentei carregar o primeiro plist que você forneceu e funcionou para mim. Quais permissões estão definidas para o arquivo?
imalison
Este é um código incrível para muitas coisas. Estou usando uma mistura de scripts fantoches e personalizados do bash para gerenciar muitos dispositivos diferentes do macOS, e problemas aleatórios porque a sessão de auditoria de segurança ou o domínio do usuário não estão corretos são muito comuns. Ótimo trabalho!
Andrew White