systemd 是为了管理系统服务的程序 链接到标题
systemd一般是第一个进程 管理服务 (这里的服务主要是指在后台运行的程序,输入\出都不为用户所知) systemd 中最小单元是unit也叫service,unit就是一个程序,可由systemd的配置文件配置好如何启动,如何运行,何时运行,运行多久,运行多少次(其实这个软件可以用来代替cron和at这两个东西,但不如这两个方便)
unit操作(其实也可以操作更多) 链接到标题
| 操作 | 命令 | 说明 |
|---|---|---|
| 分析系统状态 | ||
| 查看系统状态 | systemctl status |
|
| 列出运行中的单元 | systemctl 或 systemctl list-units |
|
| 列出失败的单元 | systemctl --failed |
|
| 列出已安装的单元文件 | systemctl list-unit-files |
|
| 查看指定 PID 的进程状态 | systemctl status <pid> |
包括 cgroup slice、内存和父进程信息 |
| 检查单元状态 | ||
| 查看单元关联的手册页 | systemctl help <unit> |
需单元支持 |
| 查看单元状态 | systemctl status <unit> |
包括是否正在运行 |
| 检查单元是否已启用 | systemctl is-enabled <unit> |
|
| 启动、重启、重载单元 | ||
| 立即启动单元 | systemctl start <unit> |
需 root 权限 |
| 立即停止单元 | systemctl stop <unit> |
需 root 权限 |
| 重启单元 | systemctl restart <unit> |
需 root 权限 |
| 重载单元及其配置 | systemctl reload <unit> |
需 root 权限 |
| 重载 systemd 管理器配置 | systemctl daemon-reload |
需 root 权限;扫描新增或变更的单元 |
| 启用单元 | ||
| 设置单元开机自启 | systemctl enable <unit> |
需 root 权限 |
| 设置单元开机自启并立即启动 | systemctl enable --now <unit> |
需 root 权限 |
| 取消单元开机自启 | systemctl disable <unit> |
需 root 权限 |
| 取消单元开机自启并立即停止 | systemctl disable --now <unit> |
需 root 权限 |
| 重新启用单元 | systemctl reenable <unit> |
需 root 权限;即先禁用再重新启用 |
| 屏蔽单元 | ||
| 屏蔽单元(使其无法启动) | systemctl mask <unit> |
需 root 权限 |
| 解除单元屏蔽 | systemctl unmask <unit> |
需 root 权限 |
| 这里注意 |
- reload的启动的服务的配置文件
- 不要乱搞mask,搞之前看看依赖。
systemctl list-dependencies 你要看的服务.target
soft reboot (不知道是什么,说是可以不停机切换内核,有点高级以后再看) 链接到标题
配置文件编写 链接到标题
路径 链接到标题
配置文件启动顺序超级复杂,有system层面的和user层面的(我是不知道这两个有什么区别,我都是默认的直接用系统层面的)
用systemctl show --property=UnitPath | cat看那些是配置目录
用系统层面要注意下面几个配置目录
- /usr/lib/systemd/system/: units provided by installed packages
- /run/systemd/system/: units installed by the system administrator, deleted on power-off (useful for #Editing provided units)
- /etc/systemd/system/: units installed by the system administrator
- /usr/local/lib/systemd/system : 这个一般是下载的软件自动配置的地方
使用 systemd 时,依赖关系可以通过正确设计单元文件来解决。最典型的场景是单元 A 需要在单元 B 运行后才能启动。此时,在 A 的 [Unit] 段中添加 Requires=B 和 After=B。如果该依赖是可选的,则改用 Wants=B 和 After=B。注意,Wants= 和 Requires= 并不隐式包含 After=,这意味着如果未指定 After=,两个单元将会并行启动。 依赖通常应放在服务上,而不是放在目标上。例如,network.target 是由配置网络接口的服务拉起的,因此将你的自定义单元排序在其之后(After=network.target)就足够了,因为 network.target 反正会被启动。
类型 链接到标题
在[Service]下Type=指定服务类型
- simple 最简单的类型,这个应该是一启动,服务就启动,并且不会自己fork的那种
- notify 和simple一样,但在daemon准备好时要向systemd发送ready信号 就是一直在内存中运行
- forking 启动后会自己fork自己的,就是一段时间换一个进程的服务
- oneshot 启动一次后自己结束,就是不在内存中运行,这种只有start和inactive两种状态不会有active这种情况
- dbus 和simple类似,但会用dbus发消息(就是需要dbus的simple)
- idle 所有服务结束后启动的simple,最大延迟是5秒,多用于服务运行完了汇报。
更改已提供的units 链接到标题
systemd-delta # 这个用于看那个配置改了那个配置
要么用systemctl edit编辑个别服务,要么systenctl daemon-reload重启所有服务
ssh服务实战 链接到标题
man sshd_config # 看看配置文件在那里
这里不是用apt这种包管理下载sshd,而是创建sshd服务
touch /etc/systemd/system/sshd2.service # 这里写sshd2是因为一般/usr/lib/systemd/system/下有应用提供的默认已经安装好的sshd服务
cat /usr/lib/systemd/system/sshd.service #参照人家写的自己抄一个试试看
这里要改的主要是execstart要改改,还有不要用默认的sshd的配置,要不然会冲突
这就安装好了,再可以用systemctl list-unit-files --all | grep ssh2看看自己搞的sshd2服务了,用上面提到的systemctl应该可以很好管理这个服务