【Linux】重大なエラーが全ユーザへ通知(wall)されるのを抑止する


DebianをはじめとするLinuxのディストリビューションでは重大なエラーがsyslogに記録された際にSSH等を含めその時ログインしている全員にその内容を通知するという設定がデフォルトになっています。しかしその通知を望ましくないと思っている管理者もいるのではないかと思います。今回はそのメッセージを抑止する方法をご紹介します。

手っ取り早く設定方法だけ知りたいという方はここから読み進めてください。

ログのレベルについて

syslogのメッセージには1つ1つにレベルというものが設定されています。ほとんど気にしなくて良いinfoだとか、errorのように。 そのレベルのうち最上位、システムが停止する可能性がある重大なエラーをemergと分類しています。多くのディスとリビュージョンではこのメッセージが出力た際にログイン中の全ユーザのターミナルに通知されるという設定になっています。

wallという機能を知る

話を始める前にいくつかの機能を確認です。wallという機能をご存知でしょうか。この機能は現在ログインしているユーザ全員に通知をする機能です。SSHなどで2窓した状態で片方の窓から下記のコマンドを実行してみましょう。

# wall test

するともう片方の窓にはその内容が表示されているはずです。

Broadcast message from root@localhost.localdomain (pts/1) (Thu Jan 20 01:12:38 
                                                                               
test
                                                                          
[nogisawa@localhost ~]$ 

これがwallです。特にシャットダウンを実行した際に目にすると思います。ここではユーザ全員に通知する機能程度に思っておいてください。(実際それ以外の機能もないんですけど…)

loggerコマンドを知る

Linuxにはloggerというコマンドがいます。このコマンドは意図的にsyslogの出力を生成する為のコマンドです。試しに下記のコマンドを実行してみましょう。

# logger test

その後にsyslogを確認してみてください。

# tail -n 1 /var/log/syslog
Jan 21 15:32:55 localhost XXXX: test

syslogにtestというメッセージが記録されました。

先程メッセージにはレベルがあると言いましたが、-pオプションでその指定が可能です。例えばerrorとしたい場合下記のようにします。

# logger -p error test

現状の確認方法

loggerコマンドの使い方を知った所で実際にloggerコマンドを使って再現してみましょう。

SSHなどを複数接続して2窓した状態で下記のコマンドを実行してみましょう。

root@localhost:~ # logger -p emerg EMERGE TEST

すると別の端末では下記のように表示されているはずです。

Message from syslogd@localhost.localdomain  at Jan 21 20:56:40 ...
 nogisawa: EMERGE TEST

Broadcast message from systemd-journald@localhost.localdomain (Fri 2022-01-21 20:56:40 JST):

nogisawa[18657]: EMERGE TEST

この際にメッセージが2つある事に注目してください。

syslogとsystemd-journaldの2つがメッセージをwallに投げているという事です。

その為このメッセージを抑止するにはsyslogとsystemd-journaldの2箇所で設定を行う必要があります。

rsyslogの設定

rsyslog.conに全体へ配信するための設定があります。そこをコメントアウトします。

root@localhost:~# vi /etc/rsyslog.conf 
〜〜(略)〜〜
#
# Emergencies are sent to everybody logged in.
#
*.emerg				:omusrmsg:* <--★ここをコメントアウト
〜〜(略)〜〜

rsyslogを再起動します。

root@localhost:~# systemctl restart rsyslog

systemd-jounaldの設定

jounald.confの[Jounal]セクション内に「ForwardToWall=no」という設定を追加します。

root@localhost:~# vi /etc/systemd/journald.conf 
[Journal]
〜〜(略)〜〜
ForwardToWall=no <--★追加

systemd-jounaldを再起動します。

root@localhost:~# systemctl restart systemd-jounald

確認

設定が完了すると下記コマンドを実行しても他の窓には何も表示されなくなったはずです。

root@localhost:~ # logger -p emerg EMERGE TEST