65.9K
CodeProject 正在变化。 阅读更多。
Home

关于CHKCONFIG & SYSTEMD的注意事项

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2018 年 5 月 29 日

CPOL

5分钟阅读

viewsIcon

13760

downloadIcon

66

关于自动启动服务以及如何管理和手动启动/停止服务的讨论

背景

这是一个关于 CHKCONFIGSYSTEMD 的讨论。在 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

关注点

  • 这是一篇关于 CHKCONFIGSYSTEMD 的说明;
  • 希望您喜欢我的帖子,并希望这篇说明能对您有所帮助。

历史

  • 2018 年 5 月 18 日:首次修订
© . All rights reserved.