サービスが再起動するとHUPが送信されますか?

サービスが再起動するとHUPが送信されますか?

次のようにサービスを再起動することを確認しました。

service sshd restart

次のことと非常に似ています。

pkill -HUP sshd

しかし、pkillは私のSSHセッションを閉じてサービスを再起動すると、そのセッションは開いたままになります。私の質問があります。サービスを再起動すると、pkillコマンドのように実際のHUPが送信されますか?同じ操作を実行している場合、サービスを再起動するとSSHセッションが開いたままになりますが、pkillがそれを閉じるのはなぜですか?

答え1

いいえSIGHUP、おそらくあなたの考え方ではないでしょう。

以前(1970年代)、ターミナルはシリアルラインを介してUNIXシステムに接続されたデバイスでした。当時、大規模な電話接続料を支払うよりも2台目のコンピュータを購入する方が高価でしたので、モデム回線を使用すると、遠く離れた人とコンピュータを共有できました。

マシンジョブが終了したら、実行中のすべてのジョブが停止していることを確認することが非常に必要です。なぜなら、当時のマシンには、今日のマシンが持っているのと同じ量のリソースがなかったからです。モデムが切断された場合は、シリアルラインに接続されているプロセスに信号を送信してこれを行うことを忘れないでください。これは "hang up" シグナルで、その名前は と省略されますSIGHUP

ある時点で、誰かがコンピュータのユーザーにいくつかのサービスを提供するためにプロセスを継続的に実行することが時折合理的であることがわかりました。プロセスを継続的に実行するには、プロセスを開始した端末からプロセスを分離する必要があります。これにより、ユーザーが切断され、モデムが切断されても、プロセスは実行されません。殺された。また、プロセスがシリアルラインから切り離されていないと、端末は解放されず、それを使用したい次のユーザーは利用できなくなります。だから、この理由であなたは別れるでしょう。

これで、ある時点で再構成する必要がある長期実行プロセスが作成されました。再起動するか、プロセスに設定ファイルを頻繁にポーリングさせることができます。しかし、どちらもリソースを無駄にします。設定ファイルをいつ読み直すべきかを教えていただければ、より良いでしょう。このシグナルはデーモンには意味がないので、再利用するのはどうでしょうか?はい、そのようなことが起こり、今日のコンベンションが実際にデーモンによって受信されていることがわかりましたSIGHUP

しかし、これは単なる慣例であり、一般的な法則ではありません。文書化された主な目的は、SIGHUP端末が切断されたことを示すことです。したがって、SIGHUPプロセスがデーモンであっても信号を受信すると、すべてのプログラムのデフォルトの動作はまだ終了します。

したがって、init実装できないSIGHUP管理する任意のプロセスに送信できます。はい、ほとんどの場合、再ロード操作は、SIGHUPinitシステムの設定(initスクリプト、システム単位ファイル、upstart設定、またはその他の設定など)を介してデーモンプロセスに送信されます。考えるこれはいつも起こっているので、両方が同じであると言うのも正しくありません。

時々、これは端末SIGHUPに送信されたコマンドがセッションを終了する理由を説明します。これは、sshdが何かが接続を終了したと仮定して終了する必要があるためです。sshd

答え2

~からsshd(8):

 specified in the configuration file.  sshd rereads its configuration file
 when it receives a hangup signal, SIGHUP, by executing itself with the

pkill -HUP sshdサービススクリプトと無差別の違いは、rootサービススクリプトは基本sshdプロセスのみを対象とするのに対して、サービススクリプトはそのプロセスとその親プロセスから分岐したすべての子プロセスをpkill取得します。sshd例:

% ps axo pid,ppid,command | grep ssh'[d]'
 1808     1 /usr/sbin/sshd
 8066  1808 sshd: jdoe [priv] (sshd)
28968  8066 sshd: jdoe@ttypj (sshd)
% 

init(8)(pid 1)基本プロセスsshd(pid 1808)が開始され、sshdログインしたユーザーが使用できる2つのサブプロセス(pid 8066と28968)があります。pkillサービススクリプトはHUPPID 1808にのみ送信されますが、すべてのサービスに送信されます。

答え3

これはサービスごとに非常に具体的です(したがって、私の答えはあなたが具体的sshdに言及したサービスを無視します)。

多くのサービスが実行されます。リフレッシュ受信すると、SIGHUP信号を無視または終了することもできます。

一般オートサービスの再起動(時々サービスリロード)には、デフォルトでサーバーを完全にシャットダウンして再起動することが含まれます(したがって、通常はショートカットservice $SERVICE stop; service $SERVICE start)。

最後に、呼び出しservice $SERVICE reload(または他のサービスコマンド)は、背後で次の特殊スクリプトを呼び出します。事前知識機能するサービスについて:したがって、関連サービスがSIGHUPリロードしようとすると、スクリプトはこのシグナルを送信しますが、リロード効果を得るために他のアクションがトリガーされることがあります。

答え4

これがに関するものであると仮定するupstartと、いいえ、少なくとも私のシステムにはありません。

serviceinitctl実行方法を確認できるシェルスクリプトですwhich service

restartstop+にマップされますexec start

stop転送され、合理的な時間内に動作しない可能性がSIGTERMあります(少なくともマニュアルにはそのように記載されています)。SIGKILLSIGTERM

reload新サービスを送りたい場合は、SIGHUPこれがあなたが望むものです。

関連情報