Appearance
用户、服务与日志
第四讲解决“服务怎么开机自启”“日志在哪”“为什么这个用户没权限”这三个运维问题。
先记住一句话:用户决定权限边界,服务决定进程生命周期,日志决定你能不能复盘。
一、用户与组
bash
whoami # 当前用户
id # 当前用户的 uid/gid/组
sudo useradd -m -s /bin/bash dev
sudo passwd dev
sudo usermod -aG sudo dev # 加入 sudo 组(Ubuntu)
groups # 查看当前用户所属组最小权限原则:日常用普通用户,只有需要时 sudo,不要长期以 root 登录。
二、sudo 与文件权限
bash
sudo -l # 当前用户能执行哪些 sudo 命令
sudo systemctl status sshLinux 权限模型可以概括为:用户 → 组 → 其他,每层再分读、写、执行。不要随手 chmod 777 解决问题。
三、systemd 服务管理
现代 Linux 发行版大多用 systemd:
bash
sudo systemctl status nginx # 看服务状态
sudo systemctl start nginx # 启动
sudo systemctl stop nginx # 停止
sudo systemctl restart nginx # 重启
sudo systemctl enable nginx # 开机自启
sudo systemctl disable nginx # 取消自启
systemctl list-units --type=service --state=running自定义一个最小服务:
ini
# /etc/systemd/system/demo.service
[Unit]
Description=Demo HTTP Server
After=network.target
[Service]
User=dev
WorkingDirectory=/home/dev/demo
ExecStart=/usr/bin/python3 -m http.server 18080
Restart=on-failure
[Install]
WantedBy=multi-user.targetbash
sudo systemctl daemon-reload
sudo systemctl enable --now demo
sudo systemctl status demo四、日志:journalctl 与文件日志
bash
journalctl -u nginx -n 50 # 看 nginx 最近 50 行
journalctl -u nginx -f # 实时跟踪
journalctl --since "1 hour ago"
journalctl -p err -b # 本次启动的错误日志
ls -lah /var/log # 传统文件日志
tail -f /var/log/syslog # 实时看系统日志日志三用途:定位故障时间线、找异常 IP/请求、做复盘证据。
五、动手实验
💡 动手实验:把一条命令做成 systemd 服务并观察日志。
bash
# 1. 准备一个持续输出的小脚本
mkdir -p ~/demo-service
cat > ~/demo-service/tick.sh <<'SH'
#!/usr/bin/env bash
while true; do
echo "tick $(date '+%F %T')"
sleep 5
done
SH
chmod +x ~/demo-service/tick.sh
# 2. 创建服务单元(需要 sudo)
sudo tee /etc/systemd/system/tick.service > /dev/null <<'UNIT'
[Unit]
Description=Tick demo
After=network.target
[Service]
User=$USER
ExecStart=/home/$USER/demo-service/tick.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
UNIT
# 3. 启动并看日志
sudo systemctl daemon-reload
sudo systemctl enable --now tick
journalctl -u tick -n 10 --no-pager
# 4. 清理
sudo systemctl disable --now tick
sudo rm /etc/systemd/system/tick.service
sudo systemctl daemon-reload注意:如果
$USER在 sudo 环境下取不到,请把User=和ExecStart=中的用户名手动替换成你的用户名。
小结
- 用户与组决定权限边界,
sudo只用于必要操作 - systemd 管服务:
start / stop / restart / enable / status - 服务日志优先用
journalctl -u <服务名>,文件日志看/var/log - 排查顺序:状态 → 日志 → 配置 → 权限
🧠 记忆锚点:服务不跑先 systemctl status,服务报错先 journalctl -u,权限不对先 id + ls -l。
下一讲:把代码安全地放到远程仓库——Git、SSH 与远程协作。