myfreax

如何使用systemctl管理Linux服务

systemd是一个初始化系统和系统管理器,已成为Linux发行版的新标准。由于它的大量采用,因此你必须学会使用systemd,因为它将使管理服务器变得相当容易

6 min read
By myfreax
如何使用systemctl管理Linux服务

systemd是一个初始化系统和系统管理器,已成为Linux发行版的新标准。由于它的大量采用,因此你必须学会使用systemd,因为它将使管理服务器变得相当容易。

了解systemd和使用其中包含的工具和守护程序将帮助您更好地了解它提供的强大功能、灵活性,或者帮助您更轻松地完成工作。

在本教程中,我们将讨论systemctl命令,它是用于控制init系统的中央管理工具。我们将介绍如何管理服务、检查状态、更改系统状态以及使用配置文件。

尽管systemd已成为许多Linux发行版的默认初始化系统,但它并未在所有发行版中普遍实现。

在您阅读本教程时,如果您的终端输出错误,bash: systemctl is not installed那么您的系统并没有使用systemd作为Linux的初始化系统。

初始化系统的基本目的是初始化Linux内核启动后必须启动的组件。初始化系统还用于在系统运行时管理服务器的服务和守护程序。

systemd中,大多数操作的目标是单元unit,单元按它们所代表的资源类型进行分类,并使用称为单元文件的文件进行定义。每个单元的类型可以从文件末尾的后缀中推断出来。

对于服务,目标单元是服务单元,其单元文件后缀为.service. 但是,对于大多数服务管理命令。

您实可以省略.service后缀,因为systemd会自动判断,可以知道在使用服务管理命令时您可能想要对服务进行操作。

启动和停止服务

要启动由systemd管理的服务,在服务的单元文件中执行指令,使用start命令。如果您以非root用户运行,则必须使用sudo因为这会影响操作系统的状态。

正如我们上面提到的,systemd知道查找*.service服务管理命令的文件,所以你可以省掉.service部分。

尽管您可以将上述格式用于一般管理,但为了清楚起见,我们将使用.service其余命令的后缀,以明确我们正在操作的目标。

如果要启动服务则需要使用systemctl的子命令start。要停止当前正在运行的服务,您可以使用systemctl的子命令stop

sudo systemctl start nginx.service
sudo systemctl start nginx
sudo systemctl stop nginx

重新启动和重新加载

如需要重新启动正在运行的服务,可以使用systemctl的子命令restart,后跟服务的名称。

有些应用程序能够在不重新启动的情况加载其配置文件,比如nginx。如果你只是更改nginx的server上下文的指令,您可以使用systemctl的reload命令重新加载配置文件。

如果您不确定该服务是否具有重新加载其配置的功能,您可以发出运行reload-or-restart子命令。

如果可用,这将就地重新加载配置。否则,它将重新启动服务,以重新加载配置文件。

sudo systemctl restart application.service
sudo systemctl reload application.service
sudo systemctl reload-or-restart application.service

启用和禁用服务

上述命令对于在当前会话期间启动或停止服务有用。要告诉systemd在引导时或者重新启动时自动启动服务,您必须启用它们。

要在启动时启动服务,你可以运行systemctl的子命令enable启用服务。这将创建一个符号链接。

从系统的服务文件副本,通常在/lib/systemd/system/etc/systemd/system。如果要禁用服务自动启动可以运行子命令disable

这将删除指示服务自动启动的符号链接。值得一提的是,启用服务不会在当前会话中启动它。如果您希望启动服务并在启动时启用它,则必须运行发出startenable命令。

sudo systemctl enable nginx
sudo systemctl disable nginx

检查服务状态

要检查系统上服务的状态,可以运行使用systemctl的子命令status。它将为您提供服务状态、cgroup层次结构和前几行日志。

这使您可以很好地了解应用程序的当前状态,让您了解可能出现的问题和可能需要的操作。

还有一些服务指定状态的方法。例如,要检查一个单元当前是否处于正在运行,您可以运行is-active命令。

这将返回当前的单元状态,通常是activeinactive。如果于活动状态,则退出代码将为0,从而使结果更易于在shell脚本中使用。

要查看该单元是否已启用,您可以运行is-enabled命令。这将输出服务是否enabled或者disabled。并将退出代码设置为0或1。

当启动服务或者其它单元失败时,你可以运行命令is-failed检查单元是否处于启动失败的状态。如果返回active表示它启动正常。退出代码将为1。

如果启动失败它可能会返回unknowninactive,表示单元启动失败。退出代码将为0。

sudo systemctl status nginx
sudo systemctl is-active nginx
sudo systemctl is-enabled nginx
sudo systemctl is-failed nginx

到目前为止,这些命令对于管理单个服务很有用,但它们对于探索系统的当前状态并不是很有帮助。但是systemctl的子命令list-units将会为我们提供更多单元的信息。

如果你想对systemd和systemctl想有更深入的了解,可以查看我们的教程如何列出Linux Systemd服务使用systemctl命令

结论

到目前为止,您应该熟悉该systemctl命令的一些基本功能,这些功能允许您与systemd实例进行交互和控制。