systemd使用_开始使用systemd作为故障排除工具

systemd使用

没有人会真正将systemd视为一种故障排除工具,但是当我在Web服务器上遇到问题时,我对systemd及其某些功能的日益了解帮助我定位和解决了该问题。

问题是我的服务器yorktown为家庭办公室网络提供名称服务,DHCP,NTP,HTTPD和SendMail电子邮件服务,但在正常启动期间无法启动Apache HTTPD守护程序。 我意识到它没有运行后,必须手动启动它。 这个问题已经持续了一段时间,最近我设法解决了这个问题。

你们中有些人会说systemd本身就是造成此问题的原因,并且根据我现在所知道的,我同意你的看法。 但是,我在SystemV中遇到类似类型的问题。 (在本系列的第一篇文章中,我研究了围绕systemd的争议,以替代旧的SystemV init程序和启动脚本。如果您想了解有关systemd的更多信息,请阅读第二篇第三篇文章。)没有软件是完美的,systemd和SystemV都不例外,但是systemd提供的解决问题的信息比SystemV所提供的要多得多。

确定问题

查找此问题的根源的第一步是确定httpd服务的状态:


   
   
[ root @ yorktown ~ ] # systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded ( / usr / lib / systemd / system / httpd.service; enabled; vendor preset: disabled )
   Active: failed ( Result: exit-code ) since Thu 2020 -04- 16 11 : 54 : 37 EDT; 15min ago
     Docs: man:httpd.service ( 8 )
  Process: 1101 ExecStart = / usr / sbin / httpd $OPTIONS -DFOREGROUND ( code =exited, status = 1 / FAILURE )
 Main PID: 1101 ( code =exited, status = 1 / FAILURE )
   Status: "Reading configuration..."
      CPU: 60ms

Apr 16 11 : 54 : 35 yorktown.both.org systemd [ 1 ] : Starting The Apache HTTP Server...
Apr 16 11 : 54 : 37 yorktown.both.org httpd [ 1101 ] : ( 99 ) Cannot assign requested address: AH00072: make_sock: could not bind to address 192.168.0.52: 80
Apr 16 11 : 54 : 37 yorktown.both.org httpd [ 1101 ] : no listening sockets available, shutting down
Apr 16 11 : 54 : 37 yorktown.both.org httpd [ 1101 ] : AH00015: Unable to open logs
Apr 16 11 : 54 : 37 yorktown.both.org systemd [ 1 ] : httpd.service: Main process exited, code =exited, status = 1 / FAILURE
Apr 16 11 : 54 : 37 yorktown.both.org systemd [ 1 ] : httpd.service: Failed with result 'exit-code' .
Apr 16 11 : 54 : 37 yorktown.both.org systemd [ 1 ] : Failed to start The Apache HTTP Server.
[ root @ yorktown ~ ] #

此状态信息是systemd功能之一,我发现它比SystemV提供的任何功能都有用。 这里有用的信息量使我容易得出一个合理的结论,使我朝正确的方向发展。 我从旧的chkconfig命令获得的所有信息就是服务是否正在运行以及进程ID(PID)(如果有)。 那不是很有帮助。

此状态报告中的关键条目显示HTTPD无法绑定到IP地址,这意味着它不能接受传入的请求。 这表明网络启动速度不够快,无法准备好将HTTPD服务绑定到IP地址,因为尚未设置IP地址。 不会发生这种情况,因此我浏览了网络服务系统启动配置文件。 正确的“之后”和“需要”陈述似乎都是正确的。 这是我服务器上的/lib/systemd/system/httpd.service文件:


   
   
# Modifying this file in-place is not recommended, because changes                                                                                    
# will be overwritten during package upgrades.  To customize the                                                                                      
# behaviour, run "systemctl edit httpd" to create an override unit.                                                                                  
                                                                                                                                                     
# For example, to pass additional options (such as -D definitions) to                                                                                
# the httpd binary at startup, create an override unit (as is done by                                                                                
# systemctl edit) and enter the following:                                                                                                            
                                                                                                                                                     
#       [Service]                                                                                                                                    
#       Environment=OPTIONS=-DMY_DEFINE                                                                                                              
                                                                                                                                                     
[ Unit ]                                                                                                                                                
Description =The Apache HTTP Server                                                                                                                    
Wants =httpd-init.service                                                                                                                              
After =network.target remote-fs.target nss-lookup.target httpd-init.service                                                                            
Documentation =man:httpd.service ( 8 )                                                                                                                    
                                                                                                                                                     
[ Service ]                                                                                                                                            
Type =notify                                                                                                                                          
Environment = LANG =C                                                                                                                                    
                                                                                                                                                     
ExecStart = / usr / sbin / httpd $OPTIONS -DFOREGROUND                                                                                                      
ExecReload = / usr / sbin / httpd $OPTIONS -k graceful                                                                                                      
# Send SIGWINCH for graceful stop                                                                                                                    
KillSignal =SIGWINCH                                                                                                                                  
KillMode =mixed                                                                                                                                        
PrivateTmp = true                                                                                                                                      
                                                                                                                                                     
[ Install ]                                                                                                                                            
WantedBy =multi-user.target

httpd.service单元文件明确指定应在network.targethttpd-init.service之后 (以及其他位置) 加载 。 我试图使用systemctl list-units命令查找所有这些服务,并在结果数据流中搜索它们。 全部都存在,并且应该确保在设置网络IP地址之前未加载httpd服务。

第一个解决方案

我不知道为什么IP地址花这么长时间才能分配给网络接口卡。 因此,我认为如果可以将HTTPD服务的启动延迟合理的时间,那么IP地址将在该时间之前分配。

幸运的是,上面的/lib/systemd/system/httpd.service文件提供了一些指导。 尽管它没有说要对其进行更改,但它确实指示了如何继续:使用命令systemctl edit httpd ,该命令会自动创建一个新文件( /etc/systemd/system/httpd.service.d/override.conf )并打开GNU。纳米编辑器。 (如果您不熟悉Nano,请确保查看Nano界面底部的提示。)

将以下文本添加到新文件并保存:


   
   
[ root @ yorktown ~ ] # cd /etc/systemd/system/httpd.service.d/
[ root @ yorktown httpd.service.d ] # ll
total 4
-rw-r--r-- 1 root root 243 Apr 16 11 : 43 override.conf
[ root @ yorktown httpd.service.d ] # cat override.conf
# Trying to delay the startup of httpd so that the network is
# fully up and running so that httpd can bind to the correct
# IP address
#
# By David Both, 2020-04-16

[ Service ]
ExecStartPre = / bin / sleep 30

此替代文件的[Service]部分包含一行,将HTTPD服务的启动延迟30秒。 以下状态命令显示等待时间内的服务状态:


   
   
[ root @ yorktown ~ ] # systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded ( / usr / lib / systemd / system / httpd.service; enabled; vendor preset: disabled )
  Drop-In: / etc / systemd / system / httpd.service.d
           └─override.conf
            / usr / lib / systemd / system / httpd.service.d
           └─php-fpm.conf
   Active: activating ( start-pre ) since Thu 2020 -04- 16 12 : 14 : 29 EDT; 28s ago
     Docs: man:httpd.service ( 8 )
Cntrl PID: 1102 ( sleep )
    Tasks: 1 ( limit: 38363 )
   Memory: 260.0K
      CPU: 2ms
   CGroup: / system.slice / httpd.service
           └─ 1102 / bin / sleep 30

Apr 16 12 : 14 : 29 yorktown.both.org systemd [ 1 ] : Starting The Apache HTTP Server...
Apr 16 12 : 15 :01 yorktown.both.org systemd [ 1 ] : Started The Apache HTTP Server.
[ root @ yorktown ~ ] #

并且此命令显示30秒延迟到期后HTTPD服务的状态。 服务已启动并正常运行:


   
   
[ root @ yorktown ~ ] # systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded ( / usr / lib / systemd / system / httpd.service; enabled; vendor preset: disabled )
  Drop-In: / etc / systemd / system / httpd.service.d
           └─override.conf
            / usr / lib / systemd / system / httpd.service.d
           └─php-fpm.conf
   Active: active ( running ) since Thu 2020 -04- 16 12 : 15 :01 EDT; 1min 18s ago
     Docs: man:httpd.service ( 8 )
  Process: 1102 ExecStartPre = / bin / sleep 30 ( code =exited, status = 0 / SUCCESS )
 Main PID: 1567 ( httpd )
   Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
    Tasks: 213 ( limit: 38363 )
   Memory: 21.8M
      CPU: 82ms
   CGroup: / system.slice / httpd.service
           ├─ 1567 / usr / sbin / httpd -DFOREGROUND
           ├─ 1569 / usr / sbin / httpd -DFOREGROUND
           ├─ 1570 / usr / sbin / httpd -DFOREGROUND
           ├─ 1571 / usr / sbin / httpd -DFOREGROUND
           └─ 1572 / usr / sbin / httpd -DFOREGROUND

Apr 16 12 : 14 : 29 yorktown.both.org systemd [ 1 ] : Starting The Apache HTTP Server...
Apr 16 12 : 15 :01 yorktown.both.org systemd [ 1 ] : Started The Apache HTTP Server.

我本可以尝试看看是否也可以使用较短的延迟,但是我的系统不是那么关键,因此我决定不这样做。 它可以可靠地工作,所以我很高兴。

因为我收集了所有这些信息,所以我将其作为Bug 1825554报告给Red Hat Bugzilla。 我认为报告错误比抱怨错误要有效得多。

更好的解决方案

将其报告为错误后的几天,我收到响应,指示systemd只是管理者,如果在满足某些要求后需要订购httpd,则需要在单元文件中表示它。 响应将我指向httpd.service手册页。 我希望我能早点找到它,因为它比我想出的解决方案更好。 该解决方案明确地针对必备目标单元,而不是某种程度上的随机延迟。

httpd.service手册页

在启动时启动服务

默认情况下,httpd.service和httpd.socket单元是禁用的。 要在引导时启动httpd服务,请运行: systemctl enable httpd.service 。 在默认配置中,httpd守护程序将接受任何配置的IPv4或IPv6地址在端口80上的连接(如果安装了mod_ssl,则在端口443上接受TLS连接)。

如果将httpd配置为依赖于只能在启动过程中可用的任何特定IP地址(例如,带有“ Listen”指令),或者httpd依赖于其他服务(例如数据库守护程序),则该服务必须配置为确保正确的启动顺序。

例如,要确保httpd仅在配置所有已配置的网络接口之后才运行,请使用以下部分创建一个插入文件(如上所述):

[单元]
之后= network-online.target
想要= network-online.target

我仍然认为这是一个错误,因为至少在我的经验中,在httpd.conf配置文件中使用Listen指令非常普遍。 即使在只有一个IP地址的主机上,我也一直使用Listen指令,并且在具有多个网络接口卡(NIC)和Internet协议(IP)地址的主机上显然很必要。 将以上各行添加到/usr/lib/systemd/system/httpd.service缺省文件中,对于不使用Listen指令的配置不会造成问题,而对于那些不使用Listen指令的配置,则不会造成此问题。

同时,我将使用建议的解决方案。

下一步

本文介绍了在服务器上启动Apache HTTPD服务时遇到的问题。 它引导您完成我所采取的问题确定步骤,并展示如何使用systemd进行帮助。 我还介绍了使用systemd实现的规避措施以及错误报告中提供的更好的解决方案。

正如我在开始时提到的,这很可能是systemd问题的结果,特别是httpd启动的配置。 但是,systemd为我提供了定位问题可能来源以及制定和实施规避措施的工具。 两种解决方案都不能真正解决我满意的问题。 目前,问题的根本原因仍然存在,必须解决。 如果只是将推荐的行添加到/usr/lib/systemd/system/httpd.service文件,则对我有用

我在此过程中发现的一件事是过程,我需要学习更多有关定义事物开始顺序的知识。 我将在我的下一篇文章(本系列的第五篇)中对此进行探讨。

资源资源

互联网上有大量有关systemd的信息,但是很多信息简洁,晦涩甚至是误导。 除了本文提到的资源之外,以下网页还提供了有关systemd启动的更详细和可靠的信息。

  • Fedora项目对systemd有很好的实用指南 。 它具有使用systemd配置,管理和维护Fedora计算机所需的几乎所有知识。
  • Fedora项目还有一个很好的备忘单 ,可以将旧的SystemV命令与可比的systemd命令进行交叉引用。
  • 有关systemd及其创建原因的详细技术信息,请查看Freedesktop.org 对systemd描述
  • Linux.com的“更多系统乐趣”提供了更多高级系统信息和技巧

还有systemd的设计师和主要开发者Lennart Poettering撰写的一系列针对Linux sysadmin的技术性文章。 这些文章是在2010年4月至2011年9月之间撰写的,但它们现在和那时一样具有相关性。 关于systemd及其生态系统的许多其他优点都基于这些论文。

翻译自: https://opensource.com/article/20/5/systemd-troubleshooting-tool

systemd使用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值