systemd入门教程:unit、service、target、systemctl详解 现在主流 Linux 发行版Ubuntu 16.04 以后、CentOS 7 以后、Rocky、Debian的 init 系统基本都是 systemd。开机启动哪些服务、服务崩了怎么重启、看日志去哪看全靠它。这篇把 systemd 的核心概念 unit、service、target 和主命令 systemctl 一次讲清楚。一、systemd 是什么Linux 启动后第一个跑起来的进程PID 1就是 init 系统负责拉起后面所有进程。老发行版用的是 SysV init 脚本/etc/init.d/现在换成了 systemd。它的好处是并行启动服务、按需拉起 socket、统一的日志接口。你平时接触到的 systemd 命令九成是systemctl。二、unitsystemd 的基本单元systemd 把管理对象抽象成 unit单元用配置文件描述。常见类型后缀类型管什么.service服务一个后台进程nginx、mysql.socket套接字一个网络 socket 或管道.timer定时器定时触发任务替代 crontab.mount挂载点一个文件系统挂载.target目标一组 unit 的集合类似运行级别配置文件分布在三处/usr/lib/systemd/system/包管理器安装的官方 unit/etc/systemd/system/管理员自定义的 unit优先级最高systemctl cat 服务名看一个 unit 文件的完整内容。三、systemctl核心命令语法格式systemctl[选项]子命令 单元名常用子命令命令作用sudo systemctl start 服务名立即启动sudo systemctl stop 服务名停止sudo systemctl restart 服务名重启sudo systemctl reload 服务名重载配置不中断服务sudo systemctl enable 服务名开机自启sudo systemctl disable 服务名取消开机自启systemctl status 服务名看运行状态systemctl is-active 服务名是否在运行systemctl list-units --typeservice列所有服务sudo systemctl daemon-reload改完 unit 文件后重读配置示例与预期输出启动 nginx 并设为开机自启sudosystemctl start nginxsudosystemctlenablenginx看状态systemctl status nginx预期输出节选● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2026-09-16 14:20:10 CST; 30min ago Main PID: 1284 (nginx) Tasks: 3 Memory: 2.1M CGroup: /system.slice/nginx.service ├─1284 nginx: master process /usr/sbin/nginx └─1285 nginx: worker process几个关键行Loaded: enabled表示开机自启已开Active: active (running)表示正在跑Main PID是主进程号。如果服务起不来status输出最下面几行会直接显示报错原因。四、service unit 文件长什么样自己写一个后台服务本质就是写一个.service文件。以一个示例看三段[Unit] DescriptionMy Java App Afternetwork.target [Service] Typesimple Userapprunner WorkingDirectory/opt/myapp ExecStart/usr/bin/java -jar /opt/myapp/app.jar Restarton-failure RestartSec5 [Install] WantedBymulti-user.target[Unit]元信息After表示等网络起来后再启动[Service]怎么跑ExecStart是启动命令Restarton-failure挂了自动拉起来[Install]WantedBy表示这个服务挂在哪个 target 下enable时用。写好放到/etc/systemd/system/myapp.service然后sudosystemctl daemon-reloadsudosystemctlenable--nowmyapp--now表示 enable 的同时立即启动省去单独 start 一步。五、target运行级别的现代说法老的 SysV 用运行级别0~6表示系统进到哪一步systemd 用 target 替代。对应关系传统运行级别systemd target含义0poweroff.target关机1rescue.target单用户救援模式3multi-user.target命令行多用户服务器默认5graphical.target带图形界面6reboot.target重启看当前在哪个 targetsystemctl get-default预期输出multi-user.target六、看日志journalctlsystemd 把所有服务日志统一收到 journal 里不用再去翻/var/log/下各个软件自己的日志文件。命令作用journalctl -u 服务名看某个服务的全部日志journalctl -u 服务名 -f实时跟踪类似 tail -fjournalctl -u 服务名 --since 1 hour ago看最近一小时journalctl -p err -b看本次启动以来的错误服务起不来时先systemctl status看尾部报错不够就journalctl -u 服务名 -e翻完整日志。七、知识扩展enable 和 start 不是一回事新手最容易混淆的两个动作start现在立刻把服务拉起来enable登记到开机自启列表。两者互不包含。enable一个当前没跑的服务它不会现在启动start一个没 enable 的服务重启机器后它就没了。想既现在启动、又开机自启用enable --now。另一个高频坑改了.service文件之后必须跑sudo systemctl daemon-reload否则 systemd 还认旧配置改的东西不生效。很多人改完 ExecStart 发现启动的还是老命令就是漏了这一步。