systemd 是为了管理系统服务的程序 链接到标题

systemd一般是第一个进程 管理服务 (这里的服务主要是指在后台运行的程序,输入\出都不为用户所知) systemd 中最小单元是unit也叫service,unit就是一个程序,可由systemd的配置文件配置好如何启动,如何运行,何时运行,运行多久,运行多少次(其实这个软件可以用来代替cron和at这两个东西,但不如这两个方便)

unit操作(其实也可以操作更多) 链接到标题

操作 命令 说明
分析系统状态
查看系统状态 systemctl status
列出运行中的单元 systemctlsystemctl 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应该可以很好管理这个服务