シェルのCtrl-CからSIGINTを受信するバックグラウンドプロセス(postgresql)

イヴァン

私が書いた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かどうかに関係なく)では、$-がであることに気づきましたimBHss中には存在しないshellHook状況、と私はバッシュのためのドキュメントにその意味の説明を見つけることができませんset組み込み。しかし、これは関連していない可能性があります...

イヴァン

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

これを修正する1つの方法は、を使用して独自のセッションでpostgresqlを起動することですsetsid

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

とはいえ、なぜこれがのコンテキストでのみ発生するのかはまだわかりませんshellHook

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

フォアグラウンド・プロセスプレスCtrl + C、ttyドライバまたはシェルにSIGINTを送る人

分類Dev

バックグラウンドジョブから送信されたUSR1シグナルが、Bashスクリプトでの完了を待機している親シェルプロセスによって確実に受信されないのはなぜですか?

分類Dev

デバイスの停止は、Googleクラウドメッセージングからプッシュ通知を受信します

分類Dev

コンソールのctrl + cがバックグラウンドプロセスを強制終了する理由

分類Dev

バックグラウンドのアプリは、チタンのアンドロイド用のpubnubからメッセージを受信しません

分類Dev

スクリプトのバックグラウンドプロセスが端末のSIGINTシグナルを取得するかどうかを決定するものは何ですか?

分類Dev

バックグラウンドiOSでプッシュ通知を受信する

分類Dev

サブシェルからバックグラウンドプロセスを開始する理由/(someCommand&)でペアリングする理由

分類Dev

バックグラウンドプロセスからのすべての出力を非表示にする

分類Dev

シェルスクリプトのバックグラウンドプロセスはEOFを受け取ります

分類Dev

バックグラウンドの場所を受信するとアプリがクラッシュする

分類Dev

シェルがプログラムを実行している場合、Ctrl + Cが押されたときにシェルもSIGINTシグナルを受信しますか?

分類Dev

バックグラウンドで2つの通知を受信するFCMプッシュ通知Android

分類Dev

SIGINTがスクリプトのバックグラウンドプロセスで機能しないのはなぜですか?

分類Dev

Window Phone8.1のサーバーからバックグラウンドの生のプッシュ通知を受信します

分類Dev

任意のアクティビティでバックグラウンドプロセスからのアラートダイアログを表示する

分類Dev

久しぶりにbashスクリプトで複数のバックグラウンドプログラムをSIGINTする方法は?

分類Dev

同じbashスクリプトから起動されたバックグラウンドプロセスの実行ステータスを確認する

分類Dev

プロセスのPIDをバックグラウンドで開始する方法をフィッシュシェル

分類Dev

バックグラウンドシェル関数による子プロセスのリストの取得

分類Dev

数千のファイルのサブ処理からバックグラウンドで制限されたプロセスをフォークする方法

分類Dev

数千のファイルのサブ処理からバックグラウンドで制限されたプロセスをフォークする方法

分類Dev

アプリで受信したデータをBLEデバイスからプッシュするためにIOSでバックグラウンドAPI呼び出しを定期的に行うことができません

分類Dev

シェルプロセスがバックグラウンドにあるかどうかを理解していますか?

分類Dev

バックグラウンドプロセスの出力を確認できるのはなぜですか?

分類Dev

シェルでバックグラウンドプロセスを取得するSIGCHLDのシグナルハンドラーを作成するにはどうすればよいですか?

分類Dev

バックグラウンドプロセスの信頼できるリターンコード

分類Dev

バックグラウンドプロセスのプロセスIDを取得する方法

分類Dev

Ctrl + CでSIGINTシグナルを複数のプロセスに送信できますか?

Related 関連記事

  1. 1

    フォアグラウンド・プロセスプレスCtrl + C、ttyドライバまたはシェルにSIGINTを送る人

  2. 2

    バックグラウンドジョブから送信されたUSR1シグナルが、Bashスクリプトでの完了を待機している親シェルプロセスによって確実に受信されないのはなぜですか?

  3. 3

    デバイスの停止は、Googleクラウドメッセージングからプッシュ通知を受信します

  4. 4

    コンソールのctrl + cがバックグラウンドプロセスを強制終了する理由

  5. 5

    バックグラウンドのアプリは、チタンのアンドロイド用のpubnubからメッセージを受信しません

  6. 6

    スクリプトのバックグラウンドプロセスが端末のSIGINTシグナルを取得するかどうかを決定するものは何ですか?

  7. 7

    バックグラウンドiOSでプッシュ通知を受信する

  8. 8

    サブシェルからバックグラウンドプロセスを開始する理由/(someCommand&)でペアリングする理由

  9. 9

    バックグラウンドプロセスからのすべての出力を非表示にする

  10. 10

    シェルスクリプトのバックグラウンドプロセスはEOFを受け取ります

  11. 11

    バックグラウンドの場所を受信するとアプリがクラッシュする

  12. 12

    シェルがプログラムを実行している場合、Ctrl + Cが押されたときにシェルもSIGINTシグナルを受信しますか?

  13. 13

    バックグラウンドで2つの通知を受信するFCMプッシュ通知Android

  14. 14

    SIGINTがスクリプトのバックグラウンドプロセスで機能しないのはなぜですか?

  15. 15

    Window Phone8.1のサーバーからバックグラウンドの生のプッシュ通知を受信します

  16. 16

    任意のアクティビティでバックグラウンドプロセスからのアラートダイアログを表示する

  17. 17

    久しぶりにbashスクリプトで複数のバックグラウンドプログラムをSIGINTする方法は?

  18. 18

    同じbashスクリプトから起動されたバックグラウンドプロセスの実行ステータスを確認する

  19. 19

    プロセスのPIDをバックグラウンドで開始する方法をフィッシュシェル

  20. 20

    バックグラウンドシェル関数による子プロセスのリストの取得

  21. 21

    数千のファイルのサブ処理からバックグラウンドで制限されたプロセスをフォークする方法

  22. 22

    数千のファイルのサブ処理からバックグラウンドで制限されたプロセスをフォークする方法

  23. 23

    アプリで受信したデータをBLEデバイスからプッシュするためにIOSでバックグラウンドAPI呼び出しを定期的に行うことができません

  24. 24

    シェルプロセスがバックグラウンドにあるかどうかを理解していますか?

  25. 25

    バックグラウンドプロセスの出力を確認できるのはなぜですか?

  26. 26

    シェルでバックグラウンドプロセスを取得するSIGCHLDのシグナルハンドラーを作成するにはどうすればよいですか?

  27. 27

    バックグラウンドプロセスの信頼できるリターンコード

  28. 28

    バックグラウンドプロセスのプロセスIDを取得する方法

  29. 29

    Ctrl + CでSIGINTシグナルを複数のプロセスに送信できますか?

ホットタグ

アーカイブ