RHEL7では、バグや2つのデーモン間の衝突によってsystemd-journald
一度引き継がれた多くの項目が失われる場合があります。したがって、ソケットを復元する方法など、この呼び出しに依存するプログラムは正しく機能しません。rsyslogd
/dev/log
syslog(3)
logger
/dev/log
答え1
Googleはこの問題についてあまり役に立ちませんので、直接質問して回答することをお勧めします。
通常、を使用すると、rsyslogd
モジュールはimuxsock
ソケット自体を作成し、前のエントリを作成する前に切断します。停止した/dev/log
場合rsyslogd
(誤った設定と再起動に失敗したため)rsyslogdを削除 /dev/log
。
ただし、提供されたrsyslogはRHEL7
とともに使用されることが予想され、systemd
このモジュールは実際にソケットをimuxsock
開いて削除します。/run/systemd/journal/syslog
同時にトリガーされた/dev/log
システムサービスファイルによってデバイスが作成されます。systemd-journald.socket
journald
明らかに$imjournal
、以下はモジュールを使用するかどうかに関係なく機能します。
要約すると、/dev/log
消えた場合:
systemd-journald.socket を再起動します。
systemctl restart systemd-journald.socket
その後、rsyslogd を再起動します。
systemctl start rsyslogd
アップデート:ソケットがすでに実行されている場合は、ソケットをもう一度削除できると思いますsystemctl restart rsyslogd
。rsyslogd
答え2
このsystemctl restart systemd-journald.socket && systemctl restart rsyslog
ソリューションはUbuntu 16.04では機能しませんでした。
/dev/log
代わりに、次のシンボリックリンクを再作成する必要がありました/run/systemd/journal/dev-log
。
ln -s /run/systemd/journal/dev-log /dev/log
答え3
私はsystemdとrsyslogが正確にどのように機能するのかよくわかりませんが、しばらくの間、それが触れて消えた/dev/log
理由と復元方法を見つけました。
前の回答で述べたように、Rsyslogにimuxsockモジュールを設定すると、/dev/log
サービスの起動時にソケットが作成され、/etc/rsyslog.conf
サービスが停止するとソケットが削除されます。 ~によるとimuxsock ドキュメント、ソケットがsystemdを介して渡されない場合、rsyslogはソケットのみを削除します。この場合、/dev/log
ソケットはsystemdではなくrsyslogを介して渡されるため、サービスが停止するとソケットは削除されます。
デフォルトでは(私はFedora 36を使用しています)rsyslogはimuxsockモジュールを使用しますが、「SysSock.Use = off」パラメータを使用します。これにより、rsyslogはsyslogソケット(/dev/log
)をソケットとして使用しないため、生成されません。 ()/dev/log
でこの設定を使用すると、rsyslogには何も書き込まれません。module(load="imuxsock" SysSock.use="off")
/etc/rsyslog.conf
しかし、基本的にロードされる別のモジュールがありますが、まさにimjournalモジュールです。これにより、rsyslogにsystemdログへのアクセス権が付与されます。私が理解している限り、rsyslogはソケットを生成しませんが、/dev/log
systemd-journal-dev-log.socketは生成します。ソケット/dev/log
はにシンボリックリンクされています/run/systemd/journal/dev-log
。使用されていても、 module(load="imuxsock" SysSock.use="off")
rsyslogはsystemdログからデータを取得するため、アクティビティを記録し続けます。これで/dev/log -> /run/systemd/journal/dev-log
作成されたため、ソケットがsystemdを介して渡されたため、rsyslogはそれを削除しません。
私の試みによれば、/dev/log
後で「SysSock.use = off」パラメータが追加されたか、コメントが解除されたために消える可能性があります/etc/rsyslog.conf
(imjournalモジュールがロードされた場合でも同様です)。これはrsyslogに/dev/log
。
間違いなくimjournalモジュールを再度追加してサービスを再起動すると、問題は解決します。しかし、混乱した部分は、これがうまくいかずに/dev/log -> /run/systemd/journal/dev-log
見つからないということです。これは、systemd-journald-dev-log.socket サービスがソケットの/dev/log
欠落を認識しないためです。したがって、このサービスを再起動するとソケットが失われ、systemd-journald.socketを再起動すると問題が解決します。 systemd-journald-dev-log.socketサービスを再起動しても機能するかどうかはわかりませんが、ソケットが/dev/log
再起動されます。
要約すると、ソケットを回復するには、次のようにします/dev/log
。
- 以下があることを確認してください
/etc/rsyslog.conf
。module(load="imuxsock" SysSock.use="off")
module(load="imjournal" StateFile="imjournal.state")
- rsyslogの再起動
# systemctl restart rsyslog
- systemd-journald-dev-log.socketを再起動します(「Job failed。詳細については、「journalctl -xe」を参照してください。」警告が表示されることがありますが、停止してすぐに起動するので大丈夫だと思います)。
# systemctl restart systemd-journald-dev-log.socket
- systemd-journald.socketの再起動
# systemctl restart systemd-journald.socket
注1:私が知っている限り、これはRHELシステムにのみ適用されます。 DebianまたはUbuntuベースのシステムにはこの問題がないか、他の回避策がある可能性があります。
注2:長くて混乱した答えについてお詫び申し上げます。初めて行く場所なので、まだ初心者です:D
答え4
私にとって、これはrsyslogで使用されているimuxsockモジュールがsystemdとどのように機能するかについての質問で終わりました。
内部にimuxsock ドキュメントこのモジュールがsystemdでどのように機能するかを説明します。ステップ1で問題を発見しました。
ステップ1:システムソケット名を選択
ユーザーがSysSock.Use = "off"設定を明示的に選択しないと、デフォルトの受信機ソケット(「syslogソケット」または単に「システムソケット」とも呼ばれます)の名前は/ dev / logに設定されます。それ以外の場合、ユーザーがSysSock.Use = "off"を明示的に設定した場合、rsyslogは/ dev / logまたはSysSock.Nameパラメーターで定義されたソケットを受け取りません。このセクションの残りの部分は適用されません。
ユーザーが sysSock.Name="/path/to/custom/socket" を指定して SysSock.Use="off" を明示的に設定しなかった場合、デフォルトのリスナーソケット名は /path/to/custom /socket override になります。 。 。
それ以外の場合、rsyslogがsystemdで実行されていて/run/systemd/journal/syslogが存在する場合(そしてユーザーがSysSock.Use = "off"を明示的に設定していない場合)、デフォルトのリスナーソケット名は/run/systemd/ジャーナル再定義/になります。 syslog。
システムはステップ3に達し、デフォルトのパスを「/run/systemd/journal/syslog」に変更しましたが、まだ「/var/log」を維持します。これは、imuxsockモジュールがsystemd-journald-dev-log.socketによって生成されたシンボリックリンクが必要な/ dev / logにソケットを作成しようとすることを意味します。実際のソケットを作成できない場合でも、シンボリックリンクは削除されます。
本書の結果はこの問題rsyslog githubに報告してください。ディスカッションをスキップして変更内容に直接移動するには、次を参照してください。プロモーション#1そして広報 #2それぞれ。
私の解決策は、/etc/rsyslog.confのsystemdパスを使用するようにimuxsockモジュールを設定することでした。
module(load="imuxsock"
SysSock.Name="/run/systemd/journal/syslog")
これは私の問題を解決しているようで、シンボリックリンクを手動で作成した後に再び消える理由を説明しているので、良い解決策のように聞こえます。
システムを見て、「/run/systemd/journal/syslog」が存在しない場合は、「syslog.socket」を見て、正常に起動したことを確認してください。これがソケットの作成を担当するものです。
systemctl status syslog.socket
rsyslog.service バージョンがサービスを有効にしようとしたときに、syslog.socket に必要なエイリアスとして syslog.service を定義していない可能性があります。複数のログサービスでsyslog.serviceのエイリアスを試すこともできます。この場合、最後にアクティブになったサービスが優先されます。