Como executo um comando launchd como root

32

Eu tenho o seguinte comando launchctl como um arquivo .plist. Ele é carregado e configurado para ser executado uma vez por dia, mas precisa ser executado como root e não tenho certeza de como verificar isso.

Além disso, esse trabalho cron basicamente cria CDs em um diretório e executa um comando. Tenho certeza que o launchd tem uma maneira melhor de especificar o diretório em que ele deve executar o comando.

Como sei que ele é executado como root e existe uma maneira melhor de escrever isso?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>
Emmanuel Mwangi
fonte

Respostas:

46

Em que pasta está .plistarmazenada?

launchdexecuta Daemons ( /Library/LaunchDaemonsou /System/Library/LaunchDaemons) como root e os executa independentemente de os usuários estarem logados ou não. Os agentes de inicialização ( /Library/LaunchAgents/ou ~/Library/LaunchAgents/) são executados quando um usuário está conectado como esse usuário. Você não pode usar o setuid para alterar o usuário que está executando o script nos daemons.

Como você deseja adicioná- /Library/LaunchDaemonslo, certifique-se de carregá-lo launchdcom privilégios de administrador (por exemplo, sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist)

Confira man launchdpara mais informações.

Chealion
fonte
Obrigado. Isso é exatamente o que eu estava procurando, tanto quanto respondendo à questão raiz. O script está em / Library / LaunchDaemons, portanto já estava sendo executado como root.
Emmanuel Mwangi
Uma pergunta para iniciantes: é launchctlnecessário executar a instalação de um daemon? Quero dizer, não é suficiente copiar o arquivo plist no caminho correspondente?
Claudix 30/05
@ Claudix: Está correto. Copiando a configuração launchd no lugar não é suficiente - você ainda tem que "ligar" (carga launchctl)
Chealion
4

Você já tentou usar um dos editores do launchd?

Para garantir que ele seja executado como root, tenho certeza que o launchd executará os programas como root. Já pensou em dar propriedade ao script para fazer root usando chmod? Dessa forma, ele não será executado, a menos que seja executado como root. Você precisa verificar se está sendo executado.

sudo chown root:admin script_to_run_by_launchd
hanleyp
fonte
Eu usei o Lingon para escrever esse script. E posso afirmar que funciona bem no Leopard.
Emmanuel Mwangi
3

As listas de propriedades no LaunchAgents também funcionam, mas você precisa carregar agentes e daemons com o sudo:

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

Se o plist não tiver uma chave desativada, ela será carregada no próximo login ou reinicialização por padrão e -wnão será necessária.

Nota técnica TN2083: Daemons e agentes :

Um daemon é um programa executado em segundo plano como parte do sistema geral (ou seja, não está vinculado a um usuário específico). Um daemon não pode exibir nenhuma GUI; mais especificamente, não é permitido conectar-se ao servidor de janelas.

[...]

Um agente é um processo executado em segundo plano em nome de um usuário específico. Os agentes são úteis porque podem fazer coisas que os daemons não podem, como acessar com segurança o diretório pessoal do usuário ou conectar-se ao servidor de janelas.

Lri
fonte
3

Para os Googlers que desejam executar especificamente um Agente de Inicialização com privilégios de root em vez de um Daemon de Inicialização , isso pode ser feito por:

  • Crie seu LaunchAgent no ~/Library/LaunchAgents
  • Execute seu aplicativo sudoatravés da ProgramArgumentspropriedade em seu plist
  • Defina a NOPASSWDopção para o seu aplicativo em/etc/resolvers.d

Para mais detalhes, consulte esta e esta resposta.

Cory Klein
fonte
2

O LaunchControl tornou indolor para mim em Yosemite. Ele possui uma ótima interface de arrastar e soltar para ajudá-lo a criar ou editar serviços. Foi surpreendente ver todos os serviços em execução que eu não conhecia.

Passos

  1. Iniciar LaunchControl
  2. No canto superior esquerdo, mude para GlobalDeamons e digite sua senha de administrador
  3. Arquivo-> Novo
  4. Sob o rótulo, atribua a ele um nome exclusivo. A convenção é "com.company.appname"
  5. Em Programa para executar, use o script Shell Unix ou qualquer comando que você preferir SEM argumentos
  6. Se o seu aplicativo exigir argumentos, altere o campo suspenso de "Argv padrão" para "Argv personalizado"
    1. Agora forneça o argumento que você faria normalmente, como faria na linha de comando real.
  7. Executar na carga é opcional, você decide.
  8. No lado direito, arraste e solte StartInterval e defina o intervalo desejado. O FAQ no menu Ajuda é muito bom.
Jose Leon
fonte
Você pode editar sua postagem para incluir as etapas que o solicitante pode executar para resolver o problema?
Cfinley