Linux service、systemd的作用和用法是什么?

service命令

service 命令是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。

服务(service)本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其他程序的请求,比如(mysql,sshd,防火墙等),因此我们又称为守护进程。

service运行指定服务(称之为System V初始脚本)时,把大部分环境变量去掉了,只保留LANG和TERM两个环境变量,并且把当前路径置为/,也就是说是在一个可以预测的非常干净的环境中运行服务脚本。这种脚本保存在/etc/init.d目录中,它至少要支持start和stop命令。

[root]# uname -a  #当前操作系统内核信息
Linux VM-0-11-centos 3.10.0-1160.62.1.el7.x86_64 #1 SMP Tue Apr 5 16:57:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root]# cat /proc/version  #当前操作系统版本信息
Linux version 3.10.0-1160.62.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Tue Apr 5 16:57:59 UTC 2022
[root]# cat /etc/redhat-release  #当前操作系统发行版信息
CentOS Linux release 7.6.1810 (Core) 

1.service命令格式

service  选项  服务名  控制命令
  • 选项:显示帮助信息;--status-all:显示所服务的状态。
  • 服务名:自动要控制的服务名,即/etc/init.d目录下的脚本文件名;
  • 控制命令:系统服务脚本支持的控制命令,如启动(start)、停止(stop)、重启(restart)、查看状态(status)等。
# 打印指定服务<service>的命令行使用帮助。
$ service <service>
# 启动指定的系统服务<service>
$ service <service> start
# 停止指定的系统服务<service>
$ service <service> stop
# 重新启动指定的系统服务<service>,即先停止(stop),然后再启动(start)。
$ service <service> restart
# 查看系统服务列表,以及每个服务的运行级别。
$ chkconfig --list
# 设置指定服务<service>开机时自动启动。
$ chkconfig <service> on
# 设置指定服务<service>开机时不自动启动。
$ chkconfig <service> off
# 以全屏幕文本界面设置服务开机时是否自动启动。
$ ntsysv

2.service的不足

历史上,Linux 的启动一直采用init进程。但是init进程也存在一些问题:

$ sudo /etc/init.d/apache2 start
# 或者
$ service apache2 start
  • 启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • 启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

systemd命令

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。

Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

# 查看systemctl 的版本
$ systemctl --version

Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

1.systemctl

systemctl是 Systemd 的主命令,用于管理系统。

# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue

2.systemd-analyze

systemd-analyze命令用于查看启动耗时。

# 查看启动耗时
$ systemd-analyze

# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

3.hostnamectl

hostnamectl命令用于查看当前主机的信息。

# 显示当前主机的信息
$ hostnamectl

# 设置主机名。
$ sudo hostnamectl set-hostname rhel7
3.4 localectl
localectl命令用于查看本地化设置。

# 查看本地化设置
$ localectl

# 设置本地化参数。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB

4.timedatectl

timedatectl命令用于查看当前时区设置。

# 查看当前时区设置
$ timedatectl

# 显示所有可用的时区
$ timedatectl list-timezones

# 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS

5.loginctl

loginctl命令用于查看当前登录的用户。

# 列出当前session
$ loginctl list-sessions

# 列出当前登录用户
$ loginctl list-users

# 列出显示指定用户的信息
$ loginctl show-user root