Como executo um comando launchd como root

29

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 sei como verificar isso.

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

Como sei que é executado como root e há 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>
    
por Emmanuel Mwangi 05.09.2009 / 03:00

5 respostas

45

Em qual pasta o .plist está armazenado?

launchd executa Daemons ( /Library/LaunchDaemons ou /System/Library/LaunchDaemons ) como raiz e os executará independentemente de os usuários estarem conectados ou não. Os agentes de lançamento ( /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.

Porque você vai querer adicioná-lo em /Library/LaunchDaemons , você vai querer ter certeza de que você o carregou em launchd com privilégios de administrador (por exemplo, sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist )

Confira man launchd para mais informações.

    
por 05.09.2009 / 10:30
4

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 a propriedade do script para root usando chmod? Dessa forma, ele não será executado, a menos que seja executado como root. Você precisa verificar se ele é executado.

sudo chown root:admin script_to_run_by_launchd
    
por 05.09.2009 / 05:11
2

As listas de propriedades no LaunchAgents também funcionam, mas você precisa carregar os 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 desabilitada, ela será carregada no próximo login ou reinicializada por padrão, e -w não será necessário.

Nota técnica TN2083: Daemons e agentes :

A daemon is a program that runs in the background as part of the overall system (that is, it is not tied to a particular user). A daemon cannot display any GUI; more specifically, it is not allowed to connect to the window server.

[...]

An agent is a process that runs in the background on behalf of a particular user. Agents are useful because they can do things that daemons can't, like reliably access the user's home directory or connect to the window server.

    
por 07.02.2013 / 12:19
2

LaunchControl tornou indolor para mim em Yosemite. Ele tem uma boa GUI 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.

Etapas

  1. Iniciar o LaunchControl
  2. No canto superior esquerdo, mude para GlobalDeamons e digite sua senha de administrador
  3. Arquivo- > Novo
  4. Abaixo do marcador, atribua um nome exclusivo. A convenção é "com.company.appname"
  5. Em Programa a ser executado, use o script do Unix Shell ou qualquer comando que você preferir SEM argumentos
  6. Se o seu aplicativo exigir argumentos, altere o campo suspenso de "Argv padrão" para "Argumento personalizado"
    1. agora forneça o argumento que você usaria normalmente da maneira que você o executaria a partir da linha de comando real.
  7. Executar em Carregar é opcional, você decide.
  8. Do lado direito, arraste e solte StartInterval e defina o intervalo desejado. O FAQ no menu Ajuda é muito bom.
por 13.04.2015 / 14:38
2

Para os Googlers que procuram executar especificamente um Agente de Lançamento com privilégios de root em um Daemon de Lançamento , isso pode ser feito por:

  • Crie seu LaunchAgent em ~/Library/LaunchAgents
  • Execute seu aplicativo com sudo por meio da propriedade ProgramArguments em sua plist
  • Defina a opção NOPASSWD para seu aplicativo em /etc/resolvers.d

Para mais detalhes, consulte este e esta resposta.

    
por 29.06.2017 / 22:40