Como parar corretamente o processo de shell do busybox e o processo filho?

2

O processo real do servidor é gerado por um script de shell

Estou tentando escrever um script de inicialização para djb daemontools em Entware em um roteador executando o busybox 1.24 (shell cinza). A maneira do daemontools de se iniciar, está usando o script de shell svscanboot . Note que eu removi readproctitle do svscanboot.

PATH=/opt/sbin:/opt/bin:/bin:/sbin:/usr/bin:/usr/sbin
exec </dev/null
exec >/dev/null
exec 2>/dev/null
/opt/bin/svc -dx /opt/service/* /opt/service/*/log
env - PATH=$PATH svscan /opt/service 2>&1

O processo de script de shell pai gera um processo filho (descendente) svscan , que é o processo real do servidor em execução.

O sinal TERM é recebido pelo processo de shell

Executando svscanboot & (em segundo plano) e eliminando os resultados do processo pai no processo filho em execução:

# ps l | grep svscan
S     0  1526     1  1560   404 0:0   22:57 00:00:00 {svscanboot} /bin/sh /opt/bin/svscanboot
S     0  1528  1526   976   252 0:0   22:57 00:00:00 svscan /opt/service
# killall svscanboot

Mas o svscan continuará sendo executado

# ps l | grep svscan
S     0  1528     1   976   252 0:0   22:57 00:00:00 svscan /opt/service

Executar svscanboot (em primeiro plano) e matar o processo pai também resulta no processo filho ainda em execução:

# ps l | grep svscan
S     0   676   671  1560   400 pts1  23:41 00:00:00 {svscanboot} /bin/sh /opt/bin/svscanboot
S     0   678   676   976   252 pts1  23:41 00:00:00 svscan /opt/service
# killall svscanboot
# ps l | grep svscan
S     0   678     1   976   252 pts1  23:41 00:00:00 svscan /opt/service

O Busybox é bastante limitado, killall tem somente flags -l e -q e ps tem apenas w ide, l ong e mostra T hreads.

E ao sair da versão em primeiro plano com Ctrl + C , os processos pai e filho são finalizados.

Como parar o processo pai e filho neste caso, preferencialmente usando killall e, eventualmente, modificando svscanboot ?

    
por Pro Backup 28.11.2016 / 23:58

1 resposta

0

Para exec

Depois de ler a pergunta e resposta de Significado de "exec env COMMAND" env … com um exec . Isso impedirá a desova de um processo filho. No entanto, ps outputs {svscanboot} /bin/sh /opt/bin/svscanboot . Esse nome será alterado para svscan /opt/service após o exec .

Ou para interceptar sinais

A outra maneira de lidar com isso é através de uma armadilha que propaga os sinais para o processo filho. Como Encaminhe SIGTERM para o filho no Bash ou o mais detalhadamente explicado < href="http://veithen.github.io/2014/11/16/sigterm-propagation.html"> link O problema com esta rota de solução é que o número de sinal -9 do SIGKILL não pode ser capturado.

Exec com uma solução alternativa de alteração de nome

Por não conseguir capturar o sinal KILL, escolherei a rota exec :

…
exec env - PATH=$PATH svscan /opt/service 2>&1

Isto ainda torna as coisas complicadas para parar / matar / reconfigurar o "svscanboot" dentro do sistema init Entware devido ao nome alterado. Essa alteração do nome do processo exec irá precisar de uma solução alternativa.

svscanboot de mímica

O script entware-daemontools-init-script pode ser alterado para imitar svscanboot , como:

ENABLED=yes
#PRECMD="exec </dev/null;exec >/dev/null;exec 2>/dev/null;/opt/bin/svc -dx /opt/service/* /opt/service/*/log"
PROCS="svscan"
ARGS="/opt/service 2>&1"
PATH=/opt/sbin:/opt/bin:/sbin:/bin:/usr/sbin:/usr/bin
PREARGS="env - PATH=$PATH"
DESC="daemontools"

O PRECMD comentado faz com que svscan não seja iniciado.

    
por 02.12.2016 / 17:13

Tags