Uma opção é criar outro trabalho assim:
start on started jobA
task
exec service myservice restart
Em seguida, remova o bit da raiz do setuid e o que estava abaixo dele no script de pós-inicialização.
Eu tenho este script upstart que parece um pouco com isto:
setuid userA
setgid userB
script
# ... bunch of stuff run as userA
end script
post-start script
# ... command run as userA
# ... the following command needs to be run as root
setuid root # <---- this is not legal syntax
service myservice restart # <---- I need to run this as root
end script
Então, passei pela documentação e descobri que o setuid não funciona dentro de post-start
, e userA
não está na lista de sudoers, portanto, não posso fazer apenas sudo service myservice restart
. Na verdade, na situação mais ideal, eu deveria estar executando myservice
como outro usuário.
Como obtenho isso? Estou coçando a cabeça sem nenhuma solução por um dia inteiro agora.
Como sugerido pela resposta, uma maneira é criar outra tarefa de inicialização que é executada quando o script anterior de inicialização é executado. Então, em vez de ter service myservice restart
em jobA, criamos /etc/init/myservice-hook.conf
e ativamos quando jobA está em execução (conforme a resposta).
Do meu lado, consegui resolver o problema removendo setuid
e setgid
para que o script seja executado como root e, em seguida, colocando seletivamente sudo -u userA <command>
no script. Vou usar a resposta fornecida, porque acho que tem melhor isolamento das preocupações.
Tags upstart