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.