助け合いフォーラム
正解
HUP
解説

HUPシグナルは、デーモンプログラムによっては、プログラムの設定ファイルを変更した後その設定ファイルをプロセスに再度読み込ませて設定を反映させる為に用いられます。
したがって正解はHUPです。
シグナルはkillまたはkillallコマンドでプロセスに送ります。
例)httpdプロセスに設定ファイルを再読み込みさせる場合
$ killall -HUP httpd
または
$ killall -1 httpd
その他の選択肢については上表をご確認ください。なお、「RESTART」と「REBOOT」は存在しないシグナルです。
参考
プロセスとは、システム上で動作しているプログラムの最小単位のことです。psコマンドは実行中のプロセスを一覧表示します。PID(プロセスID)やプロセス名(コマンド名)を確認できます。

また、pgrepコマンドで実行中のプロセスから特定の名前を持つプロセスIDを検索することができます。
pgrepコマンドの書式は以下のとおりです。
pgrep [オプション] 検索パターン
実行例:

検索パターンには、複数の文字列を記号で表す拡張正規表現が指定できます。以下の(as|ss)hは、ashまたはsshに一致します。-lオプションを使うと、検索パターンにマッチしたプロセス名も表示されます。

■ユーザーを指定して検索
特定のユーザーが実行したプロセスや、特定の権限で動作するプロセスも検索できます。
-Uオプションは実ユーザーで、-uオプションは実効ユーザーで検索します。実ユーザーはプロセスを起動したユーザー、実効ユーザーはプロセスの権限の判定に使われるユーザーです。
指定にはユーザー名のほか、実ユーザーの識別番号(UID)や実効ユーザーの識別番号(EUID)も使えます。
以下は、sudoで別のユーザーとして実行する例と、SUID(実行ファイルの所有者の権限で動作させる設定)によって実効ユーザーが変わる例です。

【シグナルによるプロセスの制御】
psやpgrepで調べたPIDは、killコマンドの送信先に指定できます。
kill、killall、pkillコマンドで、プロセスに終了や一時停止などを通知するシグナルを送ることができます。kill、killall、pkillコマンドの書式と主なシグナル名およびシグナル番号は以下のとおりです。
■kill:PIDで指定
kill [-シグナル名または-シグナル番号] プロセスID
または
kill -s シグナル名またはシグナル番号 プロセスID
■killall:プロセス名で指定
killall [-シグナル名または-シグナル番号] プロセス名(コマンド名)
または
killall -s シグナル名またはシグナル番号 プロセス名(コマンド名)
■pkill:プロセス名のパターンで指定
pkill [-シグナル名または-シグナル番号] プロセス名(コマンド名)
または
pkill --signal シグナル名またはシグナル番号 プロセス名(コマンド名)
kill・killallの-sとpkillの--signalは、シグナルを指定するオプションです。その後のシグナル名・番号にはハイフンを付けません。例えば、pkill -TERM mycommandとpkill --signal TERM mycommandは同じ動作です。
シグナルを指定しない場合は、kill、killall、pkillのいずれもSIGTERM(15)を送ります。

killコマンドはプロセスID(PID)を指定してシグナルを送ります。PIDは複数指定できます。
killallコマンドはプロセス名(コマンド名)を使用して、同じプロセス名の全てのプロセスに対してシグナルを送ります。
例) kill -SIGHUP 1133
例) killall -SIGHUP mycommand
また、pkillコマンドでは、プロセス名を拡張正規表現で指定できます。killallコマンドでも、-rオプションを付けると同様に指定できます。
例) killall -r 'mycommand[23]'
例)

■ジョブ番号で指定
また、killコマンドはジョブ番号を指定し、ジョブにシグナルを送ることもできます。ジョブ番号は「%ジョブ番号」と指定します。
例) kill %2
ジョブ番号はjobsコマンドで確認することができます。先頭の[ ]内の数値がジョブ番号です。
SIGHUPの効果について
質問①
この問題の解説に、以下の記載があります。
「HUPシグナルは、デーモンプログラムによっては、プログラムの設定ファイルを変更した後その設定ファイルをプロセスに再度読み込ませて設定を反映させる為に用いられます。」
上記は、以下に言い換えることができるという理解で正しいでしょうか。
「HUPシグナルにより、対象プロセスを再起動する」
質問②
上記①が正しい場合、HUPシグナルは、プログラム(プロセス)によって
単に終了してしまうものもあれば、再起動するものもあるという理解で
正しいでしょうか。
質問③
上記がいずれも正しい場合、上記解説の様に、HUPシグナルで
「プログラムの設定ファイルを変更した後その設定ファイルをプロセスに再度読み込ませて設定を反映させる」
ことができるかどうかは、プログラムの書き方に依存するので
HUPシグナルでの設定変更の反映は、プログラムごとに仕様を調べ、可能と
わかった場合のみ実施するものであるという理解で正しいでしょうか。
ご存じの方がおられましたら、教えて下さい。
宜しくお願いします。
1について:
厳密にはちょっと違いますね。 「デーモンプログラムによっては」 と記載されている通り、そのシグナルを受け取ってどう動くかはプログラム次第です。
例えば以下の記事で説明されているのですが
https://qiita.com/Kernel_OGSun/items/e96cef5487e25517a576#sigaction-c-%E8%A8%80%E8%AA%9E-api
SIGINTを受け取った時にどうする、という定義ができています。これと同様にSIGHUPを受け取った時にプロセスを再起動させるのかどうかはプログラムによるということです。
ちなみに、SIGHUPは「ハングアップ」の目的であって、終了させることはあっても起動させるというものではないです。再起動させるかどうかもそのプログラムがどう書かれているかにもよります。例えばApacheの場合は以下ページでシグナルごとの挙動が記載されています。
https://httpd.apache.org/docs/2.2/ja/stopping.html
2について:
上記の通り、「再起動」というのが厳密には正しくないですが、プログラムによって挙動が異なるという点はあっています。
3について:
HUPシグナルでの設定変更の反映は、プログラムごとに仕様を調べ、可能と
わかった場合のみ実施するものであるという理解で正しいでしょうか。
ここは発想が逆かなと思います。1のところでお見せしたApacheの場合でいうと apachectl -k stop とか apachectl -k restart とあるように、基本的には制御コマンドが発行するシグナルを適切に選択してくれるようになっています。それとは別の「学習」という話で「シグナルの種類と主な利用方法」を知るという観点ですので、知っていることでより適切な運用方法を選択できるようになる、ということですね。
あと、1でも記載したように「プログラムを書くときにどのシグナルを受け取ったらどういう挙動にさせるか」という判断の時の基礎知識にもなります。
コメント
この投稿に対して返信しませんか?
k kz5835
2023/07/29 12:37
arashi1977様 詳細な解説、誠に有難うございます。 おかげ様で、だいぶ、理解が進みました。 お忙しいことろ恐縮ですが、もう少し、教えて下さい。 頂きました情報、urlから以下の様に理解しました。 ・SIGHUPは、プロセスを終了させるものであって、再起動させるものではない ・アプリケーションの設定反映は、一般に、apacheのapachectl xxx の様に アプリケーションで用意されたコマンドで実行することである 上記の理解だけからですと、この問題の解説の 「HUPシグナルは、デーモンプログラムによっては、プログラムの設定ファイルを変更した後その設定ファイルをプロセスに再度読み込ませて設定を反映させる為に用いられます。」 は、誤りではないのかとの疑問が生じました。 これは、実際には、HUPシグナルを与えると設定ファイルを再読み込みする デーモンプログラムが多数あるので、この様に解説されているという ことなのでしょうか。 また、頂きました情報からしますと、「設定ファイルを再読み込みする」 方法は、必ずしも再起動ではなく、HUPシグナル受信により 再起動を伴わずに設定ファイルを再読み込みするデーモンプログラム も多数あるということでしょうか。 ご存じの範囲で、教えて下さい。 可能であれば、上記質問の回答に該当するデーモンプログラムの 例(名前)にも言及して頂けますと、大変に有難いです。 宜しくお願いいたします。