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.target和httpd-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及其生态系统的许多其他优点都基于这些论文。

  • 重新思考PID 1
  • 系统管理员,第一部分
  • 系统管理员,第二部分
  • 系统管理员,第三部分
  • 管理员专用的systemd,第IV部分
  • 系统管理员,第五部分
  • 管理员专用的systemd,第VI部分
  • 管理员专用系统,第七部分
  • 管理员专用的系统化第八部分
  • 管理员专用的systemd,第IX部分
  • 适用于管理员的systemd,第X部分
  • 管理员专用系统,第十一部分

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

systemd使用