systemctl配置文件及常见用法
systemd的配置文件目录
- /usr/lib/systemd/system/:每个服务最主要的启动脚本的配置放在这;
- /run/systemd/system/:系统执行过程中所产生的服务脚本所在目录,这些脚本的优先级要比/usr/lib/systemd/system/高;
- /etc/systemd/system/:管理员根据主机系统的需求所创建的执行脚本所在目录,执行优先级比/run/systemd/system/高;
配置文件的区块
[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。
- Description:简短描述
- Documentation:文档地址
- After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动,可以指定多个服务,以空格隔开,一般定义为网络服务启动后启动
- Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
- Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败(Requires为"强依赖"关系,即如果"mysqld.service"启动失败或异常退出,那么nginx.service也必须退出。)
- Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败(Wants为"弱依赖"关系,即如果"mysqld.service"启动失败或停止运行,不影响nginx.service继续执行。注意,Wants与Requires只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。)
- BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
- Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
- Condition...:当前 Unit 运行必须满足的条件,否则不会运行
- Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败
[Service]块用来 Service 的配置
- Type:定义启动时的进程行为。它有以下几种值。
- Type=simple:默认值,执行ExecStart指定的命令,启动主进程,只适合那些在shell下运行在前台的命令。也就是说,当一个命令本身会以daemon模式运行时,将不能使用simple,而应该使用Type=forking
- Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
- Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
- Type=dbus:当前服务通过D-Bus启动
- Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
- Type=idle:若有其他任务执行完毕,当前服务才会运行
- ExecStart:启动当前服务的命令
- ExecStartPre:启动当前服务之前执行的命令
- ExecStartPost:启动当前服务之后执行的命令
- ExecReload:重启当前服务时执行的命令
- ExecStop:停止当前服务时执行的命令
- ExecStopPost:停止当其服务之后执行的命令
- RestartSec:自动重启当前服务间隔的秒数
- Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
- TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
- Environment:指定环境变量
[Install]通常是配置文件的最后一个块,用来定义如何启动,以及是否开机启动。
- WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
- RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
- Alias:当前 Unit 可用于启动的别名
- Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit
例如:
#mysql 启动配置文件
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysqld/bin/mysqld_safe --defaults-file=/etc/my.cnf
[Install]
WantedBy=multi-user.target
#nginx 启动配置文件
[Unit]
Description=HTTP Server
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
[Install]
WantedBy=multi-user.target
systemctl 常用命令
# 在开机时启用一个服务
systemctl enable service
# 在开机时禁用一个服务
systemctl disable service
# 启动服务
systemctl start service
# 停止服务
systemctl stop service
# 重启服务
systemctl restart service
# 查看服务状态
systemctl status service
# 查看服务是否开机启动
systemctl is-enabled service
# 重新读取配置(不用停止nginx服务就能使修改的配置生效)
systemctl reload service
# 重新加载systemd(一般修改完配置文件执行该命令使配置生效)
systemctl daemon-reload
# 查看已启动的服务列表
systemctl list-unit-files | grep enabled
# 查看启动失败的服务列表
systemctl --failed
#列出所有激活的target
systemctl list-units -t target
#获取当前启动级别
systemctl get-default
# 设置默认启动级别
systemctl set-default
#查看服务启动配置文件
systemctl cat service
日志管理
Systemd 统一管理所有 Unit 的启动日志。可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。
# 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl
# 查看内核日志(不显示应用日志)
$ sudo journalctl -k
# 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0
# 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1
# 查看指定时间的日志
journalctl --since="2012-10-30 18:17:16"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2015-01-10" --until "2015-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"
# 显示尾部的最新10行日志
journalctl -n
# 显示尾部指定行数的日志
journalctl -n 20
# 实时滚动显示最新日志
journalctl -f
# 查看指定服务的日志
journalctl /usr/lib/systemd/systemd
# 查看指定进程的日志
journalctl _PID=1
# 查看某个路径的脚本的日志
journalctl /usr/bin/bash
# 查看指定用户的日志
journalctl _UID=33 --since today
# 查看某个 Unit 的日志
journalctl -u nginx.service
journalctl -u nginx.service --since today
# 实时滚动显示某个 Unit 的最新日志
journalctl -u nginx.service -f
# 合并显示多个 Unit 的日志
journalctl -u nginx.service -u php-fpm.service --since today
# 查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
journalctl -p err -b
# 日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager
# 以 JSON 格式(单行)输出
journalctl -b -u nginx.service -o json
# 以 JSON 格式(多行)输出,可读性更好
journalctl -b -u nginx.service -o json-pretty
# 显示日志占据的硬盘空间
journalctl --disk-usage
# 指定日志文件占据的最大空间
journalctl --vacuum-size=1G
# 指定日志文件保存多久
journalctl --vacuum-time=1years
本文是原创文章,采用 CC BY-NC-SA 许可协议,完整转载请注明来自 半城小栈
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果