私が書いたshell.nix
私のプロジェクトのいずれかの開発環境を構築するためにファイルを。にshellHook
ドロップしたときにpostgresqlサーバーが確実に起動するようにを使用していnix-shell
ます。
shellHook
本質的です:
export PGDATA=$PWD/nix/pgdata
pg_ctl start --silent --log $PWD/log/pg.log
pg_ctl
バックグラウンドでサーバーを起動するという事実にもかかわらず、シェルでCtrl-Cを入力すると、サーバーがシャットダウンします。nix-shellの外部で同じシナリオを設定した場合、これは発生しません。
私はstraceを初めて使用しますがSIGINT
、ターミナルで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プロセスはpts/12
、nix-shellプロセスと同じ制御端末()に接続されています(ただし、これは、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
。s
中には存在しないshellHook
状況、と私はバッシュのためのドキュメントにその意味の説明を見つけることができませんset
組み込み。しかし、これは関連していない可能性があります...
問題は、postgresqlサーバーがを介して起動したシェルと同じプロセスグループの一部として実行されていたことであるようpg_ctl
です。入力するSIGINT
と、グループ内のすべてのプロセスにが伝播されます。
これを修正する1つの方法は、を使用して独自のセッションでpostgresqlを起動することですsetsid
。
setsid pg_ctl start --silent --log $PWD/log/pg.log
とはいえ、なぜこれがのコンテキストでのみ発生するのかはまだわかりませんshellHook
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加