服务,服务,服务。服务是计算的重要组成部分。您正在通过一项服务阅读这篇文章。您的计算机正在运行服务。互联网上充满了服务。
关于 systemctl
在 Linux 上,运行和管理服务的标准方法是通过 systemd 实用程序和 systemctl
命令。它的用法相当简单:您只需要知道要管理的服务名称,然后您可以使用此命令来启动或 停止服务、检查其状态或执行其他功能。
# systemctl start httpd
# systemctl stop httpd
# systemctl status httpd
单元文件
服务在名为单元文件的文件中定义。它们通常位于 /usr/lib/systemd/system
目录中。这是一个示例列表
# ls /usr/lib/systemd/system
auditd.service multi-user.target sys-kernel-debug.mount
autovt@.service multi-user.target.wants sys-kernel-tracing.mount
basic.target NetworkManager-dispatcher.service syslog.socket
basic.target.wants NetworkManager.service syslog.target.wants
blk-availability.service NetworkManager-wait-online.service
有时您需要在单台主机上运行服务的多个实例。例如,如果您正在为多个客户维护网站,安全法规要求每个客户都有自己的独立实例。这意味着您需要为每个客户运行一个新的 Apache HTTP 服务,但拥有大量服务可能难以管理。如果您有 10 个不同的客户,您将不得不创建 10 个单独的单元文件来管理它们。幸运的是,有一种更好的方法来处理服务的多个实例。
@ 符号
请注意,某些单元文件的名称中带有 @ 符号。此符号具有有趣的意义。事实上,安装 Apache HTTP 服务器后,您可能会注意到多个服务单元文件,包括一个名称中带有 @ 符号的文件 — httpd@.service
。
我将向您展示这如何使系统管理员的生活更轻松一些,以 Apache HTTP 服务器为例进行说明
# dnf -y install httpd
# cd /usr/lib/systemd/system
# ls -d http*
httpd.service httpd@.service httpd.service.d httpd.socket httpd.socket.d
@ 符号表示将进行替换。Systemd 将获取您在其后键入的任何内容,并替换服务单元文件中的变量 %i
。可以在 httpd@.service
文件的摘录中看到该变量
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd@.service(8)
[Service]
Type=notify
Environment=LANG=C
Environment=HTTPD_INSTANCE=%i
ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-%i
ExecStartPre=/bin/chown root.apache /run/httpd/instance-%i
ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-%i
ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-%i
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/%i.conf
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful -f conf/%i.conf
请注意,默认的 httpd 单元文件 httpd.service
其名称中没有 @ 符号,并且看起来有所不同。它用于 Apache HTTP 服务器的单个基本默认实例。
运行多个实例
要使用此特殊单元文件运行多个实例,每个实例都需要一个唯一的名称。假设您有两个客户,小银行和大银行。将实例命名为 littlebank 和 bigbank。要管理其中一个,只需在其名称后附加 @ 符号。使用适当的命令启动每个实例
- littlebank:
systemctl start httpd@littlebank
- bigbank:
systemctl start httpd@bigbank
请记住,大多数服务需要某些配置以避免不同实例之间的冲突。我不会在此处涵盖所有这些配置,但 Apache 需要一些东西,包括唯一的监听端口号、PID 文件和文档根目录。
我将通过尝试启动 littlebank 实例来演示。我预计它会失败,但它会提供有用的状态消息
# systemctl start httpd@littlebank
# systemctl status httpd@littlebank
● httpd@littlebank.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd@.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2020-11-10 11:41:20 EST; 1min 58s ago
Docs: man:httpd@.service(8)
Process: 2205 ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2207 ExecStartPre=/bin/chown root.apache /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2208 ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2209 ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2210 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/littlebank.conf (code=exited, status=1/FAILURE)
Main PID: 2210 (code=exited, status=1/FAILURE)
CPU: 26ms
Nov 10 11:41:20 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Nov 10 11:41:20 localhost.localdomain httpd[2210]: httpd: Could not open configuration file /etc/httpd/conf/littlebank.conf>
Nov 10 11:41:20 localhost.localdomain systemd[1]: httpd@littlebank.service: Main process exited, code=exited, status=1/FAIL>
Nov 10 11:41:20 localhost.localdomain systemd[1]: httpd@littlebank.service: Failed with result 'exit-code'.
Nov 10 11:41:20 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
您可以看到 systemd 正确地将实例名称替换为单元文件中 %i
变量的位置。但是,Apache 启动失败,因为它无法打开配置文件。因此,现在我将设置实例以包括在 /etc/httpd/conf/
中创建必要的配置文件 (littlebank.conf
和 bigbank.conf
)
# ls /etc/httpd/conf
bigbank.conf httpd.conf littlebank.conf
现在您可以使用 systemctl
管理每个实例。向每个实例发出 start
和 status
命令。我已将输出缩短为最相关的详细信息
# systemctl start httpd@bigbank
# systemctl start httpd@littlebank
# systemctl status httpd@bigbank
● httpd@bigbank.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd@.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:26:06 EST; 56min ago
# systemctl status httpd@littlebank
● httpd@littlebank.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd@.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:25:58 EST; 55min ago
这是这些实例的进程视图。有多个进程,因为 Apache 正在派生服务器进程,这是它通常会做的
# pgrep -a httpd
2834 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2835 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2836 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
3061 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3062 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3064 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
投入使用
当您需要服务的多个实例时,这个小的 systemd 功能非常有用。我希望您能够在您的工作中充分利用它。
评论已关闭。