关于CHKCONFIG & SYSTEMD的注意事项
关于自动启动服务以及如何管理和手动启动/停止服务的讨论
背景
这是一个关于 CHKCONFIG 和 SYSTEMD 的讨论。在 Redhat 文档中,我们可以看到以下句子:
- CHKCONFIG - chkconfig 工具是一个命令行工具,允许您指定服务将在哪个运行级别启动,并列出所有可用服务及其当前设置。请注意,除了列出服务外,您必须拥有超级用户权限才能使用此命令;
- SYSTEMD - Systemd 是 Linux 操作系统的系统和服务管理器。它旨在向后兼容 SysV init 脚本,并提供许多功能,例如系统服务在启动时的并行启动、守护进程的按需激活或基于依赖关系的服务的控制逻辑。在 Red Hat Enterprise Linux 7 中,systemd 取代 Upstart 成为默认的 init 系统。
在本说明中,我将讨论自动启动服务以及如何管理和手动启动/停止服务。我将使用以下 Python 脚本文件 p-server.py 作为 HTTP 服务器。我的测试平台是一个 CentOS 7 虚拟机。如果您不喜欢 CentOS,可以使用其他 Linux 发行版。您可能会看到一些差异,但思路应该是一样的。
#!/usr/bin/python
import sys
import thread
import BaseHTTPServer
import SocketServer
args = sys.argv
PORT = int(args[1])
MSG = args[2]
class HttpHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def shutdown(self, server):
server.shutdown()
def do_GET(self):
if self.path.startswith("/EXIT=Y"):
self.send_response(200)
self.end_headers()
self.wfile.write("Shutting down the server")
thread.start_new_thread(self.shutdown, (httpd,))
else:
self.send_response(200)
self.end_headers()
self.wfile.write(MSG)
SocketServer.TCPServer.allow_reuse_address = True
httpd = SocketServer.TCPServer(("", PORT), HttpHandler)
print "serving at port", PORT
try:
httpd.serve_forever()
except KeyboardInterrupt: pass
httpd.server_close()
在大多数 Linux 发行版中,Python 默认已安装。您可以使用以下命令检查是否已安装:
which python
您可以使用以下命令运行 p-server.py 文件来启动 HTTP 服务器。
python p-server.py 12340 "Serving the HTTP GET request"
- 第一个参数
12340
是服务器将要监听的端口号; - 第二个参数
Serving the HTTP GET request
是服务器将要发送给客户端的文本内容。
您可以启动服务器并在浏览器中访问 URL "https://:12340" 来检查服务器是否正常运行。
您可以使用 wget 发送一个请求来关闭服务器。
wget -O/dev/null -q https://:12340/EXIT=Y
使用 CHKCONFIG 管理服务
要使用 CHKCONFIG
创建一个服务,您可以在 /etc/init.d 目录中创建一个脚本文件。为简单起见,我将其命名为 p-server-init
。
#!/bin/bash
# description: p-server start/stop/restart
# chkconfig: 35 20 80
P_SERVER_HOME=/apps/simple-python-server
PORT=12341
RESPONSE_TEXT="Server started by CHKCONFIG"
case $1 in
start)
nohup python $P_SERVER_HOME/p-server.py $PORT "$RESPONSE_TEXT" &
;;
stop)
wget -O/dev/null -q https://:$PORT/EXIT=Y
;;
restart)
wget -O/dev/null -q https://:$PORT/EXIT=Y
sleep 2
nohup python $P_SERVER_HOME/p-server.py $PORT "$RESPONSE_TEXT" &
;;
status)
wget -qO- https://:$PORT
echo ""
;;
esac
exit 0
我们需要使其可执行。
chmod +x p-server-init
然后,我们可以使用 CHKCONFIG
命令将其添加为服务。
chkconfig --add p-server-init
chkconfig p-server-init on
如果我们现在关闭并重启计算机,然后在 URL "https://:12341/" 处访问,我们会发现该服务在计算机启动时已启动。
运行级别
当您查看 p-server-init 文件时,您可能会对以下行感到困惑:
# chkconfig: 35 20 80
35
表示服务应在计算机启动时自动启动的运行级别;- "
20 80
" 表示在由CHKCONFIG
管理的所有服务中,启动和停止服务的优先级级别。
根据 Redhat 文档,运行级别是计算机启动时的一种操作模式。
在这 6 个运行级别中,“完全多用户文本模式
”和“完全多用户图形模式
”是最常见的操作模式。在 p-server-init 文件中,我们指示系统在这两种模式下都启动服务。除了在脚本文件中指定运行级别外,我们还可以使用以下命令来控制服务应启动的运行级别。
chkconfig --level 35 p-server-init off
chkconfig --level 35 p-server-init on
优先级级别
在 CHKCONFIG
管理的所有服务中,启动/停止的顺序有时可能很重要。p-server-init 文件中指定的数字不是精确的。如果我们查看控制网络服务启动的 /etc/init.d/network 文件,我们可以发现网络服务将以优先级 10 启动,以优先级 90 关闭。
# chkconfig: 2345 10 90
在 p-server-init 文件中,我们指示 Python 服务器比网络服务晚 20 启动,并在网络服务前 80 关闭。
CHKCONFIG 命令总结
总结来说,以下是 CHKCONFIG
最常用的命令。
chkconfig --list
chkconfig --add p-server-init
chkconfig --del p-server-init
chkconfig p-server-init on
chkconfig p-server-init off
service p-server-init start
service p-server-init stop
service p-server-init restart
service p-server-init status
使用 SYSTEMD 管理服务
为了使用 SYSTEMD
创建一个服务,我们可以创建一个脚本文件 p-start.sh 来启动 Python 服务器。
P_SERVER_HOME=/apps/simple-python-server
PORT=12342
RESPONSE_TEXT="Server started by SYSTEMD"
sleep 5
python $P_SERVER_HOME/p-server.py $PORT "$RESPONSE_TEXT"
我们需要在 /etc/systemd/system 目录中添加一个文件 p-server-system-d.service。
[Unit]
Description=Python Server Service by SystemD
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/bash -c "/apps/simple-python-server/p-start.sh"
Restart=always
[Install]
WantedBy=multi-user.target
p-server-system-d.service 文件被称为单元文件。添加或修改单元文件后,您可能需要发出以下命令来刷新 SYSTEMD
守护进程。
systemctl daemon-reload
您可以使用以下命令找到此单元文件:
systemctl list-unit-files | grep p-server-system-d.service
然后,您可以使用以下命令来启动/停止/重启和检查 Python 服务器的状态:
systemctl start p-server-system-d.service
systemctl stop p-server-system-d.service
systemctl restart p-server-system-d.service
systemctl status p-server-system-d.service
如果您希望在计算机启动时启用/禁用服务,可以发出以下命令。
systemctl enable p-server-system-d.service
systemctl disable p-server-system-d.service
单元文件位置
根据 本文档,您可以将单元文件放在三个位置:
- /etc/systemd/system
- /run/systemd/system
- /lib/systemd/system
/etc 目录中的单元文件具有最高优先级,而 /lib 目录中的单元文件具有最低优先级。根据我的经验,您应该将实际的单元文件放在这些目录中,而不是符号链接。当您在计算机上安装 Apache Web 服务器时,与之关联的单元文件会被安装到 /lib/systemd/system 目录。
SYSTEMD 目标
与 CHKCONFIG
中的运行级别类似,SYSTEMD
使用目标来描述计算机的运行状态,并且可以同时激活多个目标。您可以使用以下命令查看活动目标:
systemctl list-units --type=target
以下是我计算机上的活动目标:
在我们的单元文件 p-server-system-d.service 中,我们指示 SYSTEMD
该服务应在 network.target 之后作为 multi-user.target 的一部分启动。
“target.wants”目录
如果您在 /etc/systemd/system 目录中发出以下命令,您会看到几个名为 *.target.wants 的目录。
ls -l | grep target.wants
- 当您启用
p-server-system-d.service
时,会向 multi-user.target.wants 目录添加一个指向单元文件的符号链接; - 当您禁用 p-server-system-d.service 时,该符号链接将被删除。
*.target.wants 目录由 SYSTEMD
用来确定何时应自动启动某个服务。
SYSTEMD 命令总结
总结来说,以下是 SYSTEMD
最常用的命令。
systemctl status service-name
systemctl start service-name
systemctl stop service-name
systemctl restart service-name
systemctl status service-name
systemctl reload service-name
systemctl reload-or-restart service-name
systemctl enable service-name
systemctl disable service-name
systemctl is-active service-name
systemctl is-enabled service-name
systemctl is-failed service-name
systemctl list-unit-files
systemctl list-units
systemctl list-units --all
systemctl list-dependencies service-name
systemctl cat service-name
systemctl show service-name
systemctl mask service-name
关注点
- 这是一篇关于
CHKCONFIG
和SYSTEMD
的说明; - 希望您喜欢我的帖子,并希望这篇说明能对您有所帮助。
历史
- 2018 年 5 月 18 日:首次修订