Linux 系统高级管理完全指南:进程、服务、定时任务与日志全栈实践
本文涵盖Linux系统高级管理的四大核心模块:进程管理、systemd管控系统和服务、自动化任务配置、系统日志管理。所有命令和配置均基于主流Linux发行版(RHEL/CentOS/Debian/Ubuntu)。
一、进程管理
1.1 查看进程
ps命令——静态查看当前进程快照:
# 查看所有进程的详细信息ps aux# 查看特定用户的进程ps -u username# 树形显示进程间关系ps axjf
ps aux会列出所有进程的详细信息,包括用户、CPU使用率、内存使用率等。
top命令——动态实时监控:
# 启动toptop# top交互快捷键:# 按 P —— 按CPU使用率排序# 按 M —— 按内存使用率排序# 按 q —— 退出
htop命令——top的增强版:
htop提供更丰富的界面和更直观的操作体验。可用方向键选择进程,按F9发送信号,按F5切换树形视图。
# 安装htop(如未安装)sudo apt install htop # Debian/Ubuntusudo yum install htop # RHEL/CentOS# 启动htop
其他查看工具:
# 查看进程树pstree# 按名称查找进程IDpgrep nginx# 查看进程打开的文件lsof -p PID
1.2 管理进程——发送信号
使用kill、pkill、killall向进程发送信号:
# 按PID发送信号(默认SIGTERM,优雅终止)kill 1234# 强制终止kill -9 1234 # SIGKILL# 重新加载配置(不重启进程)kill -HUP 1234 # SIGHUP# 按名称终止(精确匹配)killall nginx# 按名称模式终止(支持正则)pkill -9 "python.*"# 常用信号:# 1 SIGHUP - 重新加载配置# 9 SIGKILL - 强制杀死# 15 SIGTERM - 优雅终止(默认)
1.3 调整进程优先级
Linux中Nice值范围从**-20(最高优先级)** 到**+19(最低优先级)** ,默认值为0。
启动时设置优先级(nice) :
# 以较低优先级运行(+10)nice -n 10 ./long_task.sh# 以较高优先级运行(需要root权限)sudo nice -n -5 ./critical_task.sh
调整已运行进程的优先级(renice) :
# 将PID为1234的进程优先级调整为5renice 5 -p 1234# 调整某用户所有进程的优先级renice +10 -u username# 调整某组所有进程的优先级sudo renice -n 10 -g 4 # GID为4的进程组
注意:普通用户只能调低优先级(增大nice值),只有root可以调高优先级(减小nice值)。
1.4 前后台作业管理
# 后台运行(加 &)./long_task.sh &# 查看后台作业jobs# 将后台作业调到前台fg %1# 将前台作业放到后台(先Ctrl+Z暂停,再bg)bg %1# 断开终端后继续运行nohup ./long_task.sh &
nohup的输出默认写入nohup.out文件。
二、systemd管控系统和服务
systemd是目前主流Linux发行版的默认初始化系统(PID 1),提供统一的服务管理、依赖解析、cgroup资源限制与journald日志收集。
2.1 systemctl——服务管理核心命令
基本服务操作:
# 启动服务sudo systemctl start nginx.service# 停止服务sudo systemctl stop nginx.service# 重启服务sudo systemctl restart nginx.service# 重新加载配置(不停机)sudo systemctl reload nginx.service# 查看服务状态systemctl status nginx.service
开机自启管理:
# 启用开机自启sudo systemctl enable nginx.service# 取消开机自启sudo systemctl disable nginx.service# 检查是否已启用systemctl is-enabled nginx.service# 彻底禁用(无法被其他服务启动)sudo systemctl mask nginx.service# 取消禁用sudo systemctl unmask nginx.service
查看与诊断:
# 列出所有正在运行的单元systemctl list-units# 列出所有已安装的单元文件systemctl list-unit-files# 显示服务的详细属性systemctl show nginx.service# 查看服务单元文件内容systemctl cat nginx.service# 查看启动耗时systemd-analyze blame# 查看关键启动链systemd-analyze critical-chain
2.2 编写自定义服务单元文件
自定义服务单元文件应放在/etc/systemd/system/目录下。一个完整的.service文件由三部分组成:
[Unit]段——描述与依赖
[Unit]Description=My Custom ApplicationAfter=network-online.targetWants=network-online.targetRequires=mysql.service
- •
Requires:强依赖,依赖失败则本服务也失败
建议使用network-online.target而非network.target,前者更稳健,可避免网络驱动延迟导致启动失败。
[Service]段——启动方式与行为
[Service]Type=simpleUser=appuserGroup=appgroupWorkingDirectory=/opt/myappExecStart=/opt/myapp/venv/bin/python worker.pyExecReload=/bin/kill -HUP $MAINPIDRestart=on-failureRestartSec=5sStartLimitBurst=5StartLimitIntervalSec=60s
Type字段最常用的三种:
- •
simple(默认):前台运行,启动后不fork - •
forking:传统daemon,会fork子进程后父进程退出,需配合PIDFile - •
notify:程序通过sd_notify通知systemd已就绪,时序最准确
Restart字段:
- •
on-failure:非零退出码或被信号杀掉时重启(推荐)
资源限制(通过cgroup实现):
[Service]MemoryMax=512M # 内存上限,超出即OOMCPUQuota=50% # CPU使用上限TasksMax=100 # 最大任务数
[Install]段——安装目标
[Install]WantedBy=multi-user.target
WantedBy=multi-user.target表示系统进入多用户模式时启动此服务,systemctl enable会根据此配置创建软链接。
完整示例
# /etc/systemd/system/myapp.service[Unit]Description=My Python Web ApplicationAfter=network-online.targetWants=network-online.target[Service]Type=simpleUser=appGroup=appWorkingDirectory=/opt/myappExecStart=/usr/bin/python3 /opt/myapp/app.pyRestart=on-failureRestartSec=5sMemoryMax=512M[Install]WantedBy=multi-user.target
部署新服务
# 创建/修改单元文件后,必须重新加载systemdsudo systemctl daemon-reload# 启用并启动sudo systemctl enable myapp.servicesudo systemctl start myapp.service# 验证状态systemctl status myapp.service
2.3 systemd timer——现代化的定时任务
systemd timer是cron的现代替代方案,具备更好的日志、依赖管理和状态追踪能力。
创建定时器需要两个文件:
1. 服务单元文件(定义要执行的任务):
# /etc/systemd/system/backup.service[Unit]Description=Daily Backup[Service]Type=oneshotExecStart=/usr/local/bin/backup.sh
2. 定时器单元文件(定义触发规则):
# /etc/systemd/system/backup.timer[Unit]Description=Run backup daily at 3am[Timer]OnCalendar=dailyOnCalendar=03:00:00Persistent=true[Install]WantedBy=timers.target
启用并启动定时器:
sudo systemctl enable backup.timersudo systemctl start backup.timer# 查看定时器状态systemctl list-timers
三、自动化任务配置(Cron)
3.1 Cron基础
Cron是Linux经典的基于时间的作业调度器。配置分为两层:
系统级配置:/etc/crontab及/etc/cron.d/目录
# /etc/crontab 示例SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# 每天凌晨3点执行备份0 3 * * * root /scripts/backup.sh
用户级配置:通过crontab -e编辑,存储在/var/spool/cron/下
# 编辑当前用户的定时任务crontab -e# 查看当前用户的定时任务crontab -l# 删除所有定时任务(慎用)crontab -r
预定义目录(脚本放入即可自动执行):
- •
/etc/cron.hourly/ —— 每小时 - •
/etc/cron.weekly/ —— 每周 - •
/etc/cron.monthly/ —— 每月
3.2 Cron时间表达式
* * * * * 要执行的命令│ │ │ │ ││ │ │ │ └── 星期 (0-7, 0和7都代表周日)│ │ │ └──── 月份 (1-12)│ │ └────── 日期 (1-31)│ └──────── 小时 (0-23)└────────── 分钟 (0-59)
运算符:
常用示例:
# 每5分钟执行*/5 * * * * /script.sh# 每天下午3点执行0 15 * * * /script.sh# 每周一至周五下午3点执行0 15 * * 1-5 /script.sh# 每月1号和15号凌晨执行0 0 1,15 * * /script.sh# 每小时执行0 * * * * /script.sh
3.3 Cron日志与调试
Cron任务默认静默失败,需主动配置日志:
# 在crontab中重定向输出0 3 * * * /scripts/backup.sh >> /var/log/backup.log 2>&1# 查看cron日志journalctl -u cron -f # systemd系统tail -f /var/log/syslog # 传统系统
四、系统日志管理
现代Linux系统通常采用systemd-journald + rsyslog的双日志架构。
4.1 journalctl——查询systemd日志
基本查询:
# 查看某服务的日志journalctl -u nginx.service# 实时跟踪(类似tail -f)journalctl -u nginx.service -f# 查看最近10分钟的日志journalctl -u nginx --since "10 min ago"# 查看今天的日志journalctl --since today# 查看本次启动后的日志journalctl -b# 查看上次启动的日志(调试启动失败)journalctl -b -1# 只看错误级别及以上journalctl -p err -b# 查看内核日志journalctl -k
多条件过滤:
# 按服务名和PID过滤journalctl _SYSTEMD_UNIT=docker.service _PID=12345# 输出JSON格式(便于脚本处理)journalctl -u nginx -o json# 查看特定可执行文件的日志journalctl /usr/bin/bash
4.2 配置日志持久化
journald默认将日志存储在/run/log/journal/(内存中),重启后丢失。启用持久化:
# 1. 创建持久化目录sudo mkdir -p /var/log/journal# 2. 编辑配置文件sudo vim /etc/systemd/journald.conf
推荐配置:
[Journal]Storage=persistent # 启用持久化SystemMaxUse=2G # 最大磁盘占用SystemKeepFree=4G # 保留可用空间SystemMaxFileSize=128M # 单文件大小SystemMaxFiles=100 # 最大文件数MaxRetentionSec=30day # 最长保留30天Compress=yes # 启用压缩Seal=yes # 日志签名防篡改
# 3. 重启journaldsudo systemctl restart systemd-journald# 4. 查看实际占用journalctl --disk-usage
手动清理日志:
# 压缩到500MB以内journalctl --vacuum-size=500M# 只保留7天journalctl --vacuum-time=7d# 强制立即轮转journalctl --rotate
4.3 rsyslog配置
rsyslog主配置文件为/etc/rsyslog.conf,自定义配置放在/etc/rsyslog.d/*.conf。
# 编辑rsyslog配置sudo vim /etc/rsyslog.conf# 或添加自定义规则sudo vim /etc/rsyslog.d/50-default.conf
常见日志文件位置:
- •
/var/log/syslog —— 系统整体日志 - •
/var/log/auth.log —— 认证日志 - •
/var/log/kern.log —— 内核日志 - •
/var/log/messages —— 通用系统消息
# 修改配置后重启rsyslogsudo systemctl restart rsyslog
4.4 journald与rsyslog协同
两者可共存:journald采集日志后通过imjournal模块转发给rsyslog,rsyslog再按规则写入文本文件。若只需journald,可在/etc/systemd/journald.conf中设置ForwardToSyslog=no以节省IO。
完整日志管理组合:systemd-journald + rsyslog + logrotate覆盖从采集、持久化到归档的全流程。
五、综合实战:部署一个自愈服务
以下示例结合systemd服务、cron健康检查和journalctl日志监控:
1. 创建服务单元~/.config/systemd/user/myapp.service:
[Unit]Description=My Python Web AppAfter=network.target[Service]ExecStart=/usr/bin/python3 -m http.server 8080Restart=alwaysRestartSec=5WorkingDirectory=/home/user/myapp[Install]WantedBy=default.target
2. 启用用户服务:
systemctl --user daemon-reloadsystemctl --user enable myappsystemctl --user start myapp
3. 创建健康检查脚本~/scripts/check_myapp.sh:
#!/bin/bashif ! systemctl --user is-active --quiet myapp; then echo "Service down at $(date)" | systemd-cat -p err systemctl --user restart myappfi
4. 添加到crontab(每5分钟检查):
*/5 * * * * /home/user/scripts/check_myapp.sh
5. 查看日志:
journalctl --user-unit=myapp -f
以上教程涵盖了Linux系统高级管理的四大核心模块。建议在测试环境中逐一实践,将理论知识转化为实际操作能力。