不少站长重启服务器后的固定动作:手动把php-fpm、mysql、redis一个个start起来,忘了哪个哪个挂。或者跑了个自己写的采集脚本,进程崩了没人拉,第二天才发现数据断了一夜。这些活systemd都能接管。
systemd管两类东西:系统自带的mysql、nginx这类服务(包管理器装的时候已经写好单元文件了),和你自己的程序、脚本(需要自己写单元文件)。先掌握通用命令。
systemctl status nginx # 状态、是否开机自启
systemctl enable nginx # 设置开机自启
systemctl start/stop nginx # 启动停止
systemctl restart nginx # 重启(reload是平滑重载配置)
journalctl -u nginx -f # 只跟这个服务的日志,排查神器
自己的脚本要托管,写一个unit文件,重点是Restart配置——进程崩了自动拉起来,这是夜里睡安稳觉的底气。
# /etc/systemd/system/collector.service
[Unit]
Description=网站数据采集脚本
After=network-online.target mysql.service
[Service]
Type=simple
ExecStart=/usr/bin/php /opt/scripts/collector.php
WorkingDirectory=/opt/scripts
# 核心三行:崩了自动重启,5秒后拉起,无限次
Restart=always
RestartSec=5
# 降权运行,别用root跑业务
User=www-data
[Install]
WantedBy=multi-user.target
# 写完单元文件后
systemctl daemon-reload # 必须执行,重新加载
systemctl enable --now collector.service
# enable是开机自启,--now顺便立刻启动
# 验证自愈:故意杀掉进程
pkill -f collector.php
sleep 6 && systemctl status collector
# 显示active (running)且启动时间刚刷新=自愈成功
After那行值得注意:声明依赖关系,网络和MySQL就绪后再起你的服务,避免脚本起来连不上库直接崩,然后被Restart反复拉起反复崩,日志刷屏。
还有个进阶但实用的玩法:定时任务也能写成systemd timer,比cron的优势是日志进journalctl统一可查、防止上次没跑完又起一个(防止任务重叠)。简单的每日备份用cron够了,分钟级且需要防重叠的任务用timer更稳。
数据来源:systemd官方网站
A5创业网 版权所有