shell.nix
내 프로젝트 중 하나에 대한 개발 환경을 구축하기 위해 파일을 작성했습니다 . shellHook
를 넣을 때 이를 확인하기 위해 a를 사용합니다 nix-shell
.
본질적으로 shellHook
:
export PGDATA=$PWD/nix/pgdata
pg_ctl start --silent --log $PWD/log/pg.log
서버가 백그라운드에서 시작된다는 사실에도 불구하고 pg_ctl
쉘에서 Ctrl-C를 입력하면 서버가 종료됩니다. nix-shell 외부에서 동일한 시나리오를 설정하면 이런 일이 발생하지 않습니다.
SIGINT
나는 strace를 처음 사용하지만 터미널에 Ctrl-C를 입력하면 postgresql 프로세스가 다음을 수신하는 것 같습니다 .
$ 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
...
postgresql 프로세스는 내 nix-shell 프로세스와 동일한 제어 터미널( )에 연결되어 있습니다. pts/12
(이는 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
이 문제를 디버깅하기 위한 다음 단계는 무엇입니까? 프로세스 그룹을 읽어야 합니까?
고쳐 쓰다: 한번 시도해 보세요다른 질문에 대한 팁, 이것이 문제를 해결한 것으로 나타났습니다.
set -m
pg_ctl start --silent --log $PWD/log/pg.log
이상하게도 에 따르면 $-
이 m
옵션은 이미 설정되어 있습니다. 실행은 전후에 생성됩니다 echo $-
.imBH
set -m
$-
대화형 쉘(nix-shell이든 아니든)에서 . 이 컨텍스트에 존재하지 않으며 imBHs
Bash 내장 문서에서 그 의미에 대한 설명을 찾을 수 없다는 것을 알았습니다 . 그러나 이것은 관련성이 없을 수도 있습니다 ...s
shellHook
set
답변1
설명서에 따르면
부팅 모드는 새 서버를 시작합니다. ...Unix 계열 시스템에서는 서버의 표준 출력과 표준 오류가 기본적으로 pg_ctl의 표준 출력(표준 오류 아님)으로 전송됩니다. 그런 다음 pg_ctl의 표준 출력은 파일로 리디렉션되거나 Rotatelogs와 같은 로그 회전 프로그램과 같은 다른 프로세스로 파이프되어야 합니다.그렇지 않으면postgres는 (백그라운드에서) 제어 터미널에 출력을 쓰고쉘을 떠나지 않는 프로세스 그룹. ...-l 또는 출력 리디렉션을 사용하는 것이 좋습니다..
쉘에서 pg_ctl을 분리하려면 출력을 리디렉션해야 하는 것 같습니다.
답변2
문제는 postgresql 서버가 시작된 쉘과 동일한 프로세스 그룹의 일부로 실행되고 있다는 것입니다 pg_ctl
. a를 입력하면 SIGINT
그룹의 모든 프로세스에 a가 전파됩니다 .
이 문제를 해결하는 한 가지 방법은 setsid
.
setsid pg_ctl start --silent --log $PWD/log/pg.log
그런데 왜 이런 일이 .NET에서만 발생하는지 아직도 모르겠습니다 shellHook
.