环境:RHEL 7.6
@ systemctl常用命令传送门 => RHEL7.6 起停服务命令(以防火墙为例)https://blog.csdn.net/wy_hhxx/article/details/103034212
@ 路径 /usr/lib/systemd/system 下有很多service文件,例如firewalld.service, sshd.service...
@ systemctl status 的输出
[root@xxx ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: active (running) since Wed 2021-03-31 11:47:15 CST; 5s agoDocs: man:firewalld(1)Main PID: 25793 (firewalld)Tasks: 2CGroup: /system.slice/firewalld.service└─25793 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopidMar 31 11:47:14 xxx systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 31 11:47:15 xxx systemd[1]: Started firewalld - dynamic firewall daemon.
[root@xxx ~]#
说明:
Loaded行 | 配置文件的位置,是否设为开机启动,此例是disabled,即开机不启动防火墙 |
Active行 | running表示正在运行 |
Main PID行 | 主进程ID |
CGroup块 | 应用的所有子进程 |
日志块 | 应用的日志 |
@ systemctl cat命令可以用来查看服务的配置文件
[root@xxx ~]# systemctl cat firewalld
# /usr/lib/systemd/system/firewalld.service
[Unit]
Description=firewalld - dynamic firewall daemon
Before=network-pre.target
Wants=network-pre.target
After=dbus.service
After=polkit.service
Conflicts=iptables.service ip6tables.service ebtables.service ipset.service
Documentation=man:firewalld(1)[Service]
EnvironmentFile=-/etc/sysconfig/firewalld
ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS
ExecReload=/bin/kill -HUP $MAINPID
# supress to log debug and error output also to /var/log/messages
StandardOutput=null
StandardError=null
Type=dbus
BusName=org.fedoraproject.FirewallD1
KillMode=mixed[Install]
WantedBy=multi-user.target
Alias=dbus-org.fedoraproject.FirewallD1.service
[root@xxx ~]#
说明:
1. [Unit] 定义启动顺序与依赖关系
Description字段 | service的简单描述 |
Documentation字段 | 文档位置 |
Before字段 | 定义应该在哪些服务之前启动,如果network-pre.target需要启动,那么firewalld.service应该在它之前启动 |
After字段 | 定义应该在哪些服务之后启动,如果dbus.service, polkit.service需要启动,那么firewalld.service应该在它们之后启动 |
Wants字段 | 表示弱依赖"关系,如果network-pre.target启动失败或停止运行,不影响firewalld.service继续执行 |
Requires字段 | 表示"强依赖"关系,即如果该服务启动失败或异常退出,那么firewalld.service也必须退出 |
2. [Service] 定义如何启动当前服务
启动命令 | EnvironmentFile字段 | 指定当前服务的环境参数文件 |
ExecStart字段 | 定义启动进程时执行的命令 |
ExecReload字段 | 重启服务时执行的命令 |
ExecStop字段 | 停止服务时执行的命令 |
ExecStartPre字段 | 启动服务之前执行的命令 |
ExecStartPost字段 | 启动服务之后执行的命令 |
启动类型 | Type字段 | simple(默认值):ExecStart字段启动的进程为主进程 forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程 oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务 |
重启行为 | KillMode字段 | 定义 Systemd 如何停止 sshd 服务 control-group(默认值):当前控制组里面的所有子进程,都会被杀掉 process:只杀主进程 mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号 none:没有进程会被杀掉,只是执行服务的 stop 命令 |
Restart字段 | 定义了 sshd 退出后,Systemd 的重启方式 no(默认值):退出后不会重启 on-success:只有正常退出时(退出状态码为0),才会重启 on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启 on-abnormal:只有被信号终止和超时,才会重启 on-abort:只有在收到没有捕捉到的信号终止时,才会重启 on-watchdog:超时退出,才会重启 always:不管是什么退出原因,总是重启 |
RestartSec字段 | 表示 Systemd 重启服务之前,需要等待的秒数 |
3. [Install] 定义如何安装这个配置文件,即怎样做到开机启动
WantedBy字段,表示该服务所在的 Target,Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,firewalld 所在的 Target 是multi-user.target。
常用的 Target 有两个:一个是multi-user.target,表示多用户命令行状态;另一个是graphical.target,表示图形用户状态,它依赖于multi-user.target。
执行systemctl enable firewalld.service命令时,firewalld.service的一个符号链接就会放到/etc/systemd/system目录下面的multi-user.target.wants子目录之中
[root@xxx multi-user.target.wants]# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
[root@xxx multi-user.target.wants]# ls -l | grep fire
lrwxrwxrwx. 1 root root 41 Mar 31 16:15 firewalld.service -> /usr/lib/systemd/system/firewalld.service
[root@xxx multi-user.target.wants]#
[root@xxx multi-user.target.wants]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@xxx multi-user.target.wants]# ls -l | grep fire
[root@xxx multi-user.target.wants]#
最后,修改配置文件后,需要重新加载配置文件(systemctl daemon-reload),然后重新启动相关服务。
更多配置项参考 https://www.freedesktop.org/software/systemd/man/systemd.service.html
参考资料:
Systemd 入门教程:实战篇 http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
/ Centos7之Systemd(Service文件)详解 https://blog.csdn.net/Mr_Yang__/article/details/84133783