次のようにサービスを再起動することを確認しました。
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
管理する任意のプロセスに送信できます。はい、ほとんどの場合、再ロード操作は、SIGHUP
initシステムの設定(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
サービススクリプトはHUP
PID 1808にのみ送信されますが、すべてのサービスに送信されます。
答え3
これはサービスごとに非常に具体的です(したがって、私の答えはあなたが具体的sshd
に言及したサービスを無視します)。
多くのサービスが実行されます。リフレッシュ受信すると、SIGHUP
信号を無視または終了することもできます。
一般オートサービスの再起動(時々サービスリロード)には、デフォルトでサーバーを完全にシャットダウンして再起動することが含まれます(したがって、通常はショートカットservice $SERVICE stop; service $SERVICE start
)。
最後に、呼び出しservice $SERVICE reload
(または他のサービスコマンド)は、背後で次の特殊スクリプトを呼び出します。事前知識機能するサービスについて:したがって、関連サービスがSIGHUP
リロードしようとすると、スクリプトはこのシグナルを送信しますが、リロード効果を得るために他のアクションがトリガーされることがあります。
答え4
これがに関するものであると仮定するupstart
と、いいえ、少なくとも私のシステムにはありません。
service
initctl
実行方法を確認できるシェルスクリプトですwhich service
。
restart
stop
+にマップされますexec start
。
stop
転送され、合理的な時間内に動作しない可能性がSIGTERM
あります(少なくともマニュアルにはそのように記載されています)。SIGKILL
SIGTERM
reload
新サービスを送りたい場合は、SIGHUP
これがあなたが望むものです。