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使用