Systemd 服务启动和停止



systemd是Linux上运行服务的新方法。systemd已经取代了sysvinitsystemd为Linux带来了更快的启动时间,并且现在是管理Linux服务的标准方法。虽然稳定,但systemd仍在不断发展。

systemd作为初始化系统,用于管理Linux内核启动后需要状态更改的服务和守护进程。状态更改包括启动、停止、重新加载和调整服务状态。

首先,让我们检查一下当前在我们的服务器上运行的systemd的版本。

[centos@localhost ~]$ systemctl --version 
systemd 219 
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP 
+GCRYPT +GNUTLS +ACL     +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN

[centos@localhost ~]$

截至本文撰写时,CentOS 7版本已完全更新,systemd版本219是当前的稳定版本。

我们还可以使用systemd-analyze分析上次服务器启动时间。

[centos@localhost ~]$ systemd-analyze    
Startup finished in 1.580s (kernel) + 908ms (initrd) + 53.225s (userspace) = 55.713s 
[centos@localhost ~]$

当系统启动时间较慢时,我们可以使用systemd-analyze blame命令。

[centos@localhost ~]$ systemd-analyze blame 
   40.882s kdump.service 
   5.775s NetworkManager-wait-online.service 
   4.701s plymouth-quit-wait.service 
   3.586s postfix.service 
   3.121s systemd-udev-settle.service 
   2.649s tuned.service 
   1.848s libvirtd.service 
   1.437s network.service 
   875ms packagekit.service 
   855ms gdm.service 
   514ms firewalld.service 
   438ms rsyslog.service
   436ms udisks2.service 
   398ms sshd.service 
   360ms boot.mount 
   336ms polkit.service 
   321ms accounts-daemon.service

在使用systemd时,了解单元的概念非常重要。单元systemd知道如何解释的资源。单元分为以下12种类型:

  • .service
  • .socket
  • .device
  • .mount
  • .automount
  • .swap
  • .target
  • .path
  • .timer
  • .snapshot
  • .slice
  • .scope

在大多数情况下,我们将使用.service作为单元目标。建议对其他类型进行进一步的研究。因为只有.service单元适用于启动和停止systemd服务。

每个单元都在以下位置的文件中定义:

  • /lib/systemd/system - 基本单元文件

  • /etc/systemd/system - 运行时启动的修改后的单元文件

使用systemctl管理服务

要使用systemd,我们需要非常熟悉systemctl命令。以下是systemctl最常用的命令行开关。

开关 动作
-t 单元类型的逗号分隔值,例如service或socket
-a 显示所有已加载的单元
--state 显示处于定义状态的所有单元,例如:load、sub、active、inactive等。
-H 远程执行操作。指定主机名或主机和用户,用@分隔。

基本的systemctl用法

systemctl [operation]
example: systemctl --state [servicename.service]

快速查看我们机器上运行的所有服务。

[root@localhost rdc]# systemctl -t service 
UNIT                       LOAD     ACTIVE      SUB     DESCRIPTION

abrt-ccpp.service          loaded   active   exited     Install ABRT coredump   hook 
abrt-oops.service          loaded   active   running    ABRT kernel log watcher 
abrt-xorg.service          loaded   active   running    ABRT Xorg log watcher 
abrtd.service              loaded   active   running    ABRT Automated Bug  Reporting Tool 
accounts-daemon.service    loaded   active   running    Accounts Service 
alsa-state.service         loaded   active   running    Manage Sound Card State (restore and store) 
atd.service                loaded   active   running    Job spooling tools 
auditd.service             loaded   active   running    Security Auditing Service 
avahi-daemon.service       loaded   active   running    Avahi mDNS/DNS-SD Stack 
blk-availability.service   loaded   active   exited     Availability of block devices 
bluetooth.service          loaded   active   running    Bluetooth service 
chronyd.service            loaded   active   running    NTP client/server

停止服务

首先,让我们停止蓝牙服务。

[root@localhost]# systemctl stop bluetooth

[root@localhost]# systemctl --all -t service | grep bluetooth      
bluetooth.service   loaded    inactive dead    Bluetooth service

[root@localhost]#

我们可以看到,蓝牙服务现在处于非活动状态。

要再次启动蓝牙服务。

[root@localhost]# systemctl start bluetooth

[root@localhost]# systemctl --all -t service | grep bluetooth 
bluetooth.service  loaded    active   running Bluetooth     service

[root@localhost]#

注意 - 我们没有指定bluetooth.service,因为.service是隐含的。最好将单元类型与我们正在处理的服务一起考虑。因此,从现在开始,我们将使用.service扩展名来明确我们正在进行服务单元操作。

可以在服务上执行的主要操作包括:

启动 启动服务
停止 停止服务
重新加载 重新加载服务的活动配置,而无需停止它(例如system v init中的kill -HUP)
重启 停止然后启动服务
启用 在启动时启动服务
禁用 停止服务在运行时自动启动

上述操作主要用于以下场景:

启动 启动已停止的服务。
停止 临时关闭服务(例如,当必须停止服务才能访问服务锁定的文件时,如升级服务时)
重新加载 当已编辑配置文件并且我们希望应用新更改而不停止服务时。
重启 与重新加载相同的场景,但服务不支持重新加载
启用 当我们希望已禁用的服务在启动时运行时。
禁用 主要用于需要停止服务但它在启动时启动的情况。

检查服务状态 -

[root@localhost]# systemctl status network.service 
network.service - LSB: Bring up/down networking 
Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled) 
Active: active (exited) since Sat 2017-01-14 04:43:48 EST; 1min 31s ago 
Docs: man:systemd-sysv-generator(8)

Process: 923 ExecStart = /etc/rc.d/init.d/network start (code=exited, status = 0/SUCCESS)

localhost.localdomain systemd[1]: Starting LSB: Bring up/down networking... 
localhost.localdomain network[923]: Bringing up loopback interface:  [  OK  ] 
localhost.localdomain systemd[1]: Started LSB: Bring up/down networking.

[root@localhost]#

显示网络服务的当前状态。如果我们想查看所有与网络相关的服务,我们可以使用 -

[root@localhost]# systemctl --all -t service | grep -i network 
network.service                       loaded    active    exited    LSB: Bring up/ 
NetworkManager-wait-online.service    loaded    active    exited    Network Manager  
NetworkManager.service                loaded    active    running   Network Manager 
ntpd.service                          loaded    inactive  dead      Network Time  
rhel-import-state.service             loaded    active    exited    Import network      

[root@localhost]#

对于熟悉sysinit服务管理方法的用户,过渡到systemd非常重要。systemd是在Linux中启动和停止守护进程服务的新方法。

广告