Eu tenho um daemon launchd ~/Library/LaunchAgents
que 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á darksair
no 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.py
cada 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:wheel
para carregá-lo.
fonte
Respostas:
A partir de
man launchctl
Fix is
fonte
chmod 644
?Estranhamente, usar
sudo
era o seu problema. Ao usarsudo
, você não era mais você mesmo, portanto não era o proprietário do seu próprio arquivo. Removasudo
, repita o comando e ele deve carregar muito bem. Desculpe pela abordagem filosófica de tudo.fonte
Encontrei a solução.
O comando correto neste caso é
E para descarregar,
launchctl load
Porém, não sei por que requer raiz, mas o carregamento / descarregamento é preterido de qualquer maneira.fonte
chmod
&chown
?Também deparei com isso, tentando usar o usuário, e não o .plist de propriedade do root (como deveria ser possível)
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)
fonte
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 :)
fonte
Remova a
UserName
chave e a string.O problema é que a
UserName
chave 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.fonte
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.
Você usaria isso da seguinte maneira:
O bsexec coloca você de volta em seu domínio e permite adicionar a tarefa como um agente de inicialização do usuário.
fonte