Esse script está errado. A máxima com a família daemontools é que o programa executado por ./run
deve ser o próprio processo de serviço , não seu pai, avô ou outro parente. Os serviços são executados, não gerados.
O uso de exec
na linha final é a idéia correta, mas é arruinado pelo uso de bash -c
explícito. Isso é desnecessário, uma vez que o script ./node
tem um interpretador de script #!/bin/bash
especificado e é (presumivelmente) executável. Melhor
#!/bin/bash exec setuidgid nodeuser ./node
Isso, claro, pode ser um nosh
(de o conjunto de ferramentas epônimo ) ou um execlineb
, porque não há necessidade real do shell Bourne Again pesado apenas para executar um único comando setuidgid
. Assim:
#!/bin/nosh setuidgid nodeuser ./nodeou
#!/command/execlineb -P s6-setuidgid nodeuser ./node
Então, quando o gerenciador de serviços chega para retirar o serviço em resposta a svc -d
, ele envia o sinal para o processo de serviço real correto.
Leitura adicional
- himdel (2013-07-24). Implantando o node.js com o apache & daemontools . Falha de segmentação.
- Steve Kemp (2014-01-04). Usando o runit para manutenção de serviços . Administração Debian.