web-dev-qa-db-ja.com

ターミナルを閉じた後も、スクリプトのバックグラウンドプロセスは存続しています

これは、Bashの質問というよりも、プロセス管理/シグナル処理の質問です。問題を説明するためにBashを使用するだけです。

バックグラウンドプロセスを実行するBashスクリプトを実行しています。これはスクリプトです:

#!/bin/bash

# ...

# The background process
{ 
  while :; do
    sleep 1 && echo foo >> /path/to/some/file.txt
  done
} &

# ...

exit 0

スクリプト自体はバックグラウンドで実行しません。単に./script

「huponexit」シェルオプションはshopt -s huponexitを使用して有効になります。したがって、端末が閉じているときに、HUP信号をBashに送信し、バックグラウンドプロセスに到達するまで伝播することを期待しています。バックグラウンドプロセスがtrapせず、シグナルを無視する場合、それも強制終了されますが、これは発生していません。バックグラウンドプロセスは、disownされたかのように機能します。

これは、問題を説明するために私が描くスキームです。スキームは、上記の説明とともに、主題を十分に理解していないと確信しているため、間違っている可能性があります。本当にそうなら、それを直してください。

enter image description here

次のようなインタラクティブシェルによって呼び出されたかのように、ターミナルを閉じた後にバックグラウンドプロセスが強制終了されない理由を知りたいです。

rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &

よくわかりませんが、私の質問に対する答えは、Bash fork()がスクリプトを実行するための非対話型シェルであり、ジョブ制御と信号処理のルールセットが異なる可能性があるという事実にあると思います。

6
Rany Albeg Wein

では、manページはhuponexitについて何を教えてくれますか?

Huponexit Shellオプションがshoptで設定されている場合、インタラクティブログインシェルが終了すると、bashはすべてのジョブにSIGHUPを送信します。

編集:それがログインシェルであることを強調します。

編集2:インタラクティブは同等の強調に値する

3
Hauke Laging