バックグラウンドプロセス(postgresql)はシェルのCtrl-CからSIGINTを受け取ります。

バックグラウンドプロセス(postgresql)はシェルのCtrl-CからSIGINTを受け取ります。

shell.nix私のプロジェクトの1つの開発環境を構築するためにファイルを作成しました。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 $-imBHset -m

$-インタラクティブシェル(nix-shellかどうかにかかわらず)から。このコンテキストには存在せず、imBHsBashの組み込み文書にその意味の説明が見つからないことがわかりました。しかし、これは関連性がないかもしれません...sshellHookset

答え1

マニュアルによると

ブートモードは新しいサーバーを起動します。 ...Unixシリーズシステムでは、サーバーの標準出力と標準エラーがデフォルトでpg_ctlの標準出力(標準エラーではない)に送信されます。その後、pg_ctlの標準出力をファイルにリダイレクトするか、Rotatelogsなどのログローテーションプログラムなどの他のプロセスにパイプする必要があります。そうでなければpostgresは(バックグラウンドで)制御端子に出力を書き込み、シェルを離れないプロセスグループ。 ...-l または出力リダイレクトを使用することをお勧めします。

シェルからpg_ctlを分離するには、出力をリダイレクトする必要があるようです。

答え2

問題は、postgresqlサーバーが起動されたシェルと同じプロセスグループの一部として実行されていることですpg_ctl。 aと入力すると、SIGINTグループ内のすべてのプロセスにaが伝播されます。

この問題を解決する1つの方法はsetsid

setsid pg_ctl start --silent --log $PWD/log/pg.log

しかし、なぜこれが.NETでのみ発生するのかはまだわかりませんshellHook

関連情報