端末を閉じた後でも、スクリプトのバックグラウンドプロセスがまだ存在します。

端末を閉じた後でも、スクリプトのバックグラウンドプロセスがまだ存在します。

これは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「ed」のように動作します。

これはこの問題を説明するために私が描いた計画です。上記の説明とスキームは、私がそのトピックを十分に理解していなかったため、間違っている可能性があります。これが本当なら、この問題を解決するのに役立ちます。

ここに画像の説明を入力してください。

次のようなインタラクティブシェルから呼び出されたように、端末を閉じた後もバックグラウンドプロセスが終了しない理由は疑問に思います。

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

わかりませんが、私の質問に対する答えは、Bash fork()がスクリプトを実行する非対話型シェルであり、他の一連のジョブ制御および信号処理ルールがある可能性があることです。

ベストアンサー1

それでは、マニュアルページは私たちに何を教えますかhuponexit

shoptを使用してhuponexitシェルオプションが設定されている場合、bashは次の場合にすべての操作にSIGHUPを送信します。対話型ログインシェルが終了します。

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

編集2:相互作用も同等の関心を得る価値があります

おすすめ記事