linux launch script / etc / init com um usuário específico

4

Eu criei um script em /etc/init/mms-agent.conf:

start on runlevel [2345]
stop on runlevel [06]

exec /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1

serviço mms-agent start / stop funciona bem, mas eu gostaria de iniciar este serviço com o usuário "mms"

Quando tento alterar o script da seguinte forma:

exec su mms -c "/usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1"

Eu obtive 3 processos em execução em vez de 1 esperado (su, bash + my python script):

mms       8864  0.0  0.2  37816  1332 ?        Ss   22:30   0:00 su mms -c /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1
mms       8865  0.0  0.2  11452  1196 ?        S    22:30   0:00 bash -c /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1
mms       8866  4.0  1.8  54672 10640 ?        Sl   22:30   0:00 python /home/mms/mms-agent/agent.py

O que isso significa?

Qual é a melhor maneira de iniciar um script com um usuário diferente do root?

Obrigado

PS:

exec start-stop-daemon --start -u mms --exec "/usr/bin/env python /home/mms/mms-agent/agent.py"

não funciona, não recebi nenhum erro, mas o processo não foi iniciado.

    
por Quentin 27.02.2012 / 23:05

3 respostas

2

Quando você executa su , o shell é substituído pelo processo su . su , em seguida, forks e execs bash . bash configura o redirecionamento de saída e, em seguida, forks e execs env . env procura o PATH, localiza python e o executa. Então você fica com três processos, 1) su , esperando que bash saia, 2) bash , esperando que python (anteriormente env ) saia e 3) python , que está ocupado com o seu script.

Não há nada de errado com isso. su é a maneira consagrada pelo Unix de trocar temporariamente os usuários, e é isso que você deve usar. Da mesma forma, a maneira de executar uma linha de comando é usar um shell, portanto su é executado bash e permite bash tratá-lo. Novamente, isso segue a abordagem geral da caixa de ferramentas Unix, permitindo que o shell faça o que o shell é bom, e não reinventando a linha de comando do shell e a funcionalidade de pesquisa PATH em outro aplicativo.

Além disso, como o bash já está fazendo a pesquisa PATH, é possível desativar o uso de env e invocar python diretamente.

    
por 27.02.2012 / 23:37
2

Veja Executar um trabalho como um usuário diferente no Manual de arranque. Usar start-stop-daemon é o método recomendado.

Você apenas cometeu um pequeno erro: passou toda a linha de comando, onde start-stop-daemon esperava o caminho para o executável. Passe os argumentos separadamente.

Outro problema com sua chamada é que você está dizendo a start-stop-daemon para considerar qualquer processo do Python como uma instância do seu serviço. Isso pode resultar na eliminação de outros processos não relacionados do Python. Para garantir que apenas uma instância do seu serviço seja executada, use um pidfile.

exec start-stop-daemon --start -c mms -u mms -m -p /var/run/mms-agent.pid \
                       --startas /usr/bin/env -- python /home/mms/mms-agent/agent.py
    
por 28.02.2012 / 00:02
1

Você obtém três processos porque está executando o su, que inicia um shell para executar o processo python.

Existem várias maneiras de convencer os dois processos "extras" que eles podem sair, por exemplo, você pode ter o fork e exec do script python, ou você pode ter o comando executado com o próprio background.

    
por 27.02.2012 / 23:29