尽管systemd解决了许多系统管理问题,但有时也令人困惑。即使是列出systemd服务之类的简单任务也会让您思考。
在本教程中,我将向您展示如何列出systemd服务。我还将解释systemd服务的状态,以便您更容易理解服务的不同状态。
systemd服务由systemctl命令管理。如果你systemctl不带任何参数运行,它会调用默认list-units子命令,并列出各种类型的systemd单元unit,如服务service、套接字socket、目标target等。
如果你只是想列出指定类型信息,可以使用systemctl的--type选项,例如命令systemctl --type=service将会列出Linux系统的所有服务。
systemctl --type=service
systemctl list-units --type=service
在这两个命令输出是相同的。默认情况下,此命令仅按字母顺序显示已加载和正在运行的服务:
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
acpid.service loaded active running ACPI event daemon
alsa-restore.service loaded active exited Save/Restore Sound Card State
apparmor.service loaded active exited Load AppArmor profiles
apport.service loaded active exited LSB: automatic crash report generation
UNIT是systemd单元的名称。LOAD是单元配置文件是否被systemd解析过。ACTIVE 单元处于活动状态。
SUB是单元的低电平状态。活动单元可以处于运行状态或退出状态。此值取决于服务类型。
如您所见,您可以列出Linux系统上已加载的服务。但是活动的systemd服务可能正在运行或可能退出状态。
默认情况下,systemctl命令只显示已加载的和活动的服务单元。服务,套接字等都有一个状态,如运行、退出等。
您可以使用systemctl的--state选项列出不同状态服务或者套接字。例如要列出正在运行的systemd服务,请使用--state=running标识。
命令sudo systemctl list-units --type=service --state=running将会列出正在运行的服务。
如果你需要列出所有已加载的服务,包括不活动的服务,请使用--all标识。你也可以像这样组合各种--all和--state标识列出服务。
每个systemd单元,无论是服务、套接字还是任何其他单元,都有一个单元文件。即使它们没有加载。
你可以运行命令sudo systemctl list-unit-files --type=service 列出在Linux系统上已安装的服务。
sudo systemctl list-units --type=service --state=running
systemctl list-units --all --type=service
systemctl list-units --all --type=service --state=inactive
systemctl list-unit-files --type=service
如需要查看系统启动时将自动运行那些systemd服务,你可以运行命令sudo systemctl list-unit-files --type=service --state=enabled。
systemctl list-unit-files --type=service --state=enabled
许多新用户将启用的系统服务与正在运行的服务混淆。但是,启用systemd服务意味着该服务将在系统启动时自动启动。
UNIT FILE STATE VENDOR PRESET
mfreax.com.service enabled enabled
你可能还会注意到字段VENDOR PRESET供应商预设。它也出现在前面的示例中。供应商预设定义了安装程序时systemd单元的行为。
假设您安装了一个新程序Nginx。在安装Nginx时,Nginx软件包将会被解压到指定的目录,其中nginx.service将会被解压到/lib/systemd/system/nginx.service。
nginx.service将会被设置为自动启动,这就是供应商预设。这意味着在安装程序后,当你启动系统时,nginx.service将在启动时自动激活。
如果供应商预设是禁用disable的,您必须手动将其设置为启用。一旦启用,它会在每次启动时自动启动。
sudo systemd enable nginx.service
到目前为止,您已经看到了列出服务的各种方式。但没有什么专注于单一服务。
您可以使用systemctl的子命令status,获取systemd服务的详细信息。如果你忘记服务的全称你可以使用制表符tab补全sudo systemctl status命令。
在查看服务状态时,可以不输入服务的扩展名称,例如查看Nginx服务的状态,你可以只输入nginx,也可以是nginx.service。套接子也可以省略.socket。
systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-08-24 08:02:17 CST; 8h ago
Docs: man:nginx(8)
Process: 795 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 829 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 830 (nginx)
Tasks: 6 (limit: 19036)
Memory: 12.2M
CGroup: /system.slice/nginx.service
├─830 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
├─831 nginx: worker process
├─832 nginx: worker process
├─833 nginx: worker process
├─834 nginx: worker process
└─835 nginx: cache manager process
8月 24 08:02:17 myfreax systemd[1]: Starting A high performance web server and a reverse proxy server...
8月 24 08:02:17 myfreax systemd[1]: Started A high performance web server and a reverse proxy server.
您可以看到它提供了大量有用的信息,例如服务的状态、服务的手册页、占用内存、进程ID等。它还显示了服务的最后几行日志。
如果要在shell脚本中检查服务是否处于活动状态,可以使用is-active子命令。systemctl is-active nginx.service退出代码为0时表示激活。
同样,如果要检查服务是否启用,设置为开机自动启动,可以使用is-enabled子命令。systemctl is-enabled nginx.service退出代码为0时表示服务自动启动。
您现在对列出systemd服务有了更好的理解。