现代 Linux 都用 systemd 管理服务替代了老的 SysVinit。部署 Java/Python 项目、写开机自启、看服务日志全都要用 systemd。这篇从 Unit 文件写到实战部署。一、什么是 systemdsystemd 系统和服务管理器 老方式 serviceSysVinit 开机顺序执行脚本无依赖关系启动慢 /etc/init.d/xxx 脚本启动 新方式 systemd 并行启动、按依赖排序、统一管理 /usr/lib/systemd/system/ 存 Unit 文件 用 systemctl 命令操作# systemctl 常用命令systemctl start nginx# 启动systemctl stop nginx# 停止systemctl restart nginx# 重启systemctl status nginx# 查看状态systemctlenablenginx# 开机自启systemctl disable nginx# 取消自启systemctl is-active nginx# 是否运行中二、编写 Unit 文件以部署一个 Java 项目为例创建/etc/systemd/system/myapp.service[Unit] DescriptionMy Java Application # 描述 Afternetwork.target mysql.service # 依赖这些服务先启动 Wantsmysql.service # 软依赖失败不阻塞 [Service] Typesimple # 简单类型主进程前台运行 Userappuser # 以哪个用户运行安全 WorkingDirectory/opt/myapp # 工作目录 ExecStart/usr/bin/java -Xms256m -Xmx512m -jar myapp.jar # 启动命令 ExecStop/bin/kill -s TERM $MAINPID # 停止命令 Restarton-failure # 失败自动重启 RestartSec5 # 重启等待5秒 EnvironmentJAVA_HOME/usr/local/jdk # 环境变量 StandardOutputappend:/var/log/myapp.log # 日志输出 StandardErrorappend:/var/log/myapp-error.log [Install] WantedBymulti-user.target # 开机自启挂载点Restart 策略对比策略行为no不自动重启默认on-failure非正常退出才重启推荐生产always任何退出都重启on-abnormal信号/超时/看门狗等异常才重启三、生效与开机自启# 写完后必须重载配置systemctl daemon-reload# 启动并设置开机自启systemctl start myapp systemctlenablemyapp# 查看状态会显示是否开机自启 enabledsystemctl status myapp部署 Java 项目的完整流程# 1. 创建应用目录并上传 jarmkdir-p/opt/myappscpmyapp.jar root服务器:/opt/myapp/# 2. 创建非root运行用户安全useradd-rappuser# 3. 写 Unit 文件内容见上vi/etc/systemd/system/myapp.service# 4. 重载并启动systemctl daemon-reload systemctlenable--nowmyapp# 5. 验证systemctl status myapptail-f/var/log/myapp.log四、日志查看 journalctljournalctl-umyapp# 查看服务全部日志journalctl-umyapp-f# 实时跟踪journalctl-umyapp--since1 hour ago# 最近1小时journalctl-umyapp-n100# 最近100行journalctl-umyapp-perr# 只看错误级别常见报错排查启动失败三步排查 1. systemctl status myapp → 看错误提示 2. journalctl -u myapp -p err → 看详细错误日志 3. 检查文件权限 / 端口占用 / 环境变量 端口被占用 ss -tlnp | grep 8080 kill -9 pid # 或改配置文件端口五、定时任务 systemd timersystemd 也能做定时任务替代 crontab# /etc/systemd/system/backup.service [Service] ExecStart/opt/scripts/backup.sh # /etc/systemd/system/backup.timer [Timer] OnCalendar*-*-* 02:30:00 # 每天凌晨2点半 Persistenttrue # 错过时间下次开机补执行 [Install] WantedBytimers.targetsystemctlenable--nowbackup.timer systemctl list-timers# 查看所有定时任务总结systemd 三个要点1. Unit 文件三部分 [Unit] 描述依赖 / [Service] 启动参数 / [Install] 自启挂载 2. 每次改 Unit 文件都要 systemctl daemon-reload 3. 日志排查用 journalctl -u 服务名 生产部署推荐配置 Typesimple Restarton-failure RestartSec5 非root用户 日志落盘到文件配合systemctl statusjournalctl再也不用担心服务挂了不知道。 觉得有用的话点赞 关注【张老师技术栈】吧