Eu escrevi um shell.nix
arquivo para construir o ambiente de desenvolvimento para um dos meus projetos. Estou usando a shellHook
para garantir que um servidor postgresql seja iniciado quando você cair no arquivo nix-shell
.
O shellHook
é essencialmente:
export PGDATA=$PWD/nix/pgdata
pg_ctl start --silent --log $PWD/log/pg.log
Apesar do fato de que pg_ctl
inicia um servidor em segundo plano, se eu digitar Ctrl-C no shell, o servidor é desligado. Se eu configurar o mesmo cenário fora do nix-shell, isso não acontece.
Sou novo no strace, mas me parece que o processo postgresql está recebendo SIGINT
quando digito Ctrl-C no meu terminal:
$ strace -p $postgres_pid
strace: Process 20546 attached
select(6, [3 4 5], NULL, NULL, {tv_sec=51, tv_usec=289149}) = ? ERESTARTNOHAND (To be restarted if no handler)
--- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
rt_sigprocmask(SIG_SETMASK, ~[ILL TRAP ABRT BUS FPE SEGV CONT SYS RTMIN RT_1], NULL, 8) = 0
write(2, "LOG: received fast shutdown req"..., 37) = 37
kill(20550, SIGTERM) = 0
...
O processo postgresql está conectado ao mesmo terminal de controle ( pts/12
) que meu processo nix-shell (embora isso também seja verdade quando eu o executo fora do nix-shell):
$ ps -p ${postgres_pid},${nixshell_pid} -o pid,ppid,wchan,tty,cmd
PID PPID WCHAN TT CMD
14608 18292 core_s pts/12 bash --rcfile /tmp/nix-shell-14608-0/rc
16355 1 core_s pts/12 /nix/store/xxxxxx-postgresql-9.6.8/bin/postgres
Qual é um bom próximo passo na depuração disso? Devo ler sobre grupos de processos?
Atualização : Tentando uma dica de outra pergunta , descobri que isso corrige o problema:
set -m
pg_ctl start --silent --log $PWD/log/pg.log
O estranho é que, segundo $-
, a m
opção já estava definida. A execução echo $-
produz imBH
antes e depois do set -m
.
Percebi que em meus shells interativos (seja nix-shell ou não), $-
é imBHs
. O s
não está presente no shellHook
contexto e não consigo encontrar uma explicação de seu significado nos documentos para o set
builtin do Bash. Mas isso pode não estar relacionado...
O manual diz
Parece que você precisa redirecionar a saída para desanexar pg_ctl do shell.
Parece que o problema era que o servidor postgresql estava sendo executado como parte do mesmo grupo de processos que o shell que o lançou via
pg_ctl
. A digitação propagou aSIGINT
para todos os processos do grupo.Uma maneira de corrigir isso é iniciar o postgresql em sua própria sessão usando
setsid
.Dito isso, ainda não sei por que isso só acontece no contexto do
shellHook
.