Linux是目前最流行的服务器操作系统,几乎所有的互联网公司都在使用Linux。作为程序员,掌握Linux系统管理是必备技能。今天就来分享Linux系统管理的实战知识,包括进程管理、服务管理、性能监控、日志分析等内容。

进程管理

进程是程序运行时的实例,是系统资源分配的基本单位。管理进程是Linux系统管理的核心内容之一。

1. 查看进程

# 查看当前终端的进程
ps

# 查看所有进程(BSD风格)
ps aux

# 查看所有进程(标准风格)
ps -ef

# 查看进程树
pstree

# 实时查看进程(类似Windows任务管理器)
top

# 更友好的top(需要安装)
htop

# 查看指定用户的进程
ps -u username

# 查看指定命令的进程
ps -C nginx

# 查看进程的详细信息
ps -p PID -o pid,ppid,user,stat,%cpu,%mem,cmd

ps aux输出字段说明

  • USER:进程所属用户
  • PID:进程ID
  • %CPU:CPU使用率
  • %MEM:内存使用率
  • VSZ:虚拟内存大小(KB)
  • RSS:物理内存大小(KB)
  • TTY:进程所在终端
  • STAT:进程状态(R运行、S睡眠、D不可中断睡眠、Z僵尸、T停止)
  • START:进程启动时间
  • TIME:进程占用CPU时间
  • COMMAND:启动进程的命令

2. 终止进程

# 终止指定PID的进程(发送TERM信号,优雅终止)
kill PID

# 强制终止进程(发送KILL信号,立即终止)
kill -9 PID

# 终止指定名称的进程
killall nginx

# 强制终止指定名称的进程
killall -9 nginx

# 根据模式终止进程
pkill -f "php-fpm"

# 查看可用信号
kill -l

常用信号

  • 1 (HUP):挂起,通常用于让进程重新加载配置
  • 2 (INT):中断,相当于Ctrl+C
  • 9 (KILL):强制终止,不可被捕获或忽略
  • 15 (TERM):终止,默认信号,进程可以优雅退出
  • 18 (CONT):继续被停止的进程
  • 19 (STOP):停止进程,不可被捕获或忽略

3. 进程优先级

# 查看进程优先级(NI列)
ps -l

# 以指定优先级启动进程(nice值范围-20到19,值越小优先级越高)
nice -n 10 command

# 修改已运行进程的优先级
renice -n 5 -p PID

# 修改指定用户所有进程的优先级
renice -n 5 -u username

4. 后台运行和作业控制

# 后台运行进程
command &

# 查看后台作业
jobs

# 将后台作业放到前台
fg %1

# 将前台作业放到后台(先按Ctrl+Z暂停,再用bg)
bg %1

# 终止后台作业
kill %1

# 不挂断地运行命令(退出终端后进程继续运行)
nohup command &

# 更强大的终端复用工具(需要安装)
screen
tmux

服务管理

服务是在后台运行的进程,通常在系统启动时自动启动,提供各种网络服务(如Web服务、数据库服务等)。

1. systemd服务管理(CentOS 7+/Ubuntu 16.04+): systemd是目前主流的系统和服务管理器,替代了传统的SysV init。

# 启动服务
systemctl start nginx

# 停止服务
systemctl stop nginx

# 重启服务
systemctl restart nginx

# 重新加载配置(不中断服务)
systemctl reload nginx

# 查看服务状态
systemctl status nginx

# 设置开机自启
systemctl enable nginx

# 取消开机自启
systemctl disable nginx

# 查看服务是否开机自启
systemctl is-enabled nginx

# 查看服务是否运行
systemctl is-active nginx

# 查看所有已启动的服务
systemctl list-units --type=service

# 查看所有服务(包括未启动的)
systemctl list-unit-files --type=service

# 查看服务的依赖关系
systemctl list-dependencies nginx

# 查看服务日志
journalctl -u nginx

# 实时查看服务日志
journalctl -u nginx -f

# 查看系统启动耗时
systemd-analyze

# 查看各服务启动耗时
systemd-analyze blame

2. service命令(兼容SysV init)

# 启动服务
service nginx start

# 停止服务
service nginx stop

# 重启服务
service nginx restart

# 重新加载配置
service nginx reload

# 查看服务状态
service nginx status

# 查看所有服务状态
service --status-all

3. chkconfig(CentOS 6及以前)

# 查看服务开机自启状态
chkconfig --list

# 设置服务开机自启
chkconfig nginx on

# 取消服务开机自启
chkconfig nginx off

# 设置服务在指定运行级别开机自启
chkconfig --level 35 nginx on

4. update-rc.d(Debian/Ubuntu)

# 设置服务开机自启
update-rc.d nginx defaults

# 取消服务开机自启
update-rc.d -f nginx remove

5. 自定义systemd服务: 创建服务文件 /etc/systemd/system/myapp.service

[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/php /var/www/myapp/server.php
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

然后启用和启动服务:

# 重新加载systemd配置
systemctl daemon-reload

# 设置开机自启
systemctl enable myapp

# 启动服务
systemctl start myapp

# 查看服务状态
systemctl status myapp

性能监控

性能监控是Linux系统管理的重要内容,通过监控可以了解系统的运行状态,发现性能瓶颈,及时处理问题。

1. CPU监控

# 实时查看CPU使用情况
top

# 更友好的top
htop

# 查看CPU信息
cat /proc/cpuinfo

# 查看CPU核心数
nproc

# 查看系统负载(1分钟、5分钟、15分钟平均负载)
uptime

# 查看CPU使用情况统计(每秒刷新,共5次)
vmstat 1 5

# 查看每个CPU核心的使用情况
mpstat -P ALL 1

# 查看进程CPU使用排名
ps aux --sort=-%cpu | head

负载(Load Average)说明

  • 负载表示系统中正在运行和等待CPU的进程数
  • 对于单核CPU,负载1.0表示CPU满负荷
  • 对于多核CPU,负载等于核心数表示满负荷
  • 一般来说,负载持续超过核心数的70%就需要关注

2. 内存监控

# 查看内存使用情况
free -h

# 查看内存详细信息
cat /proc/meminfo

# 实时查看内存使用
top
htop

# 查看虚拟内存统计
vmstat 1 5

# 查看进程内存使用排名
ps aux --sort=-%mem | head

# 查看指定进程的内存使用
pmap -d PID

# 查看内存使用情况(更详细)
smem

free输出字段说明

  • total:总内存
  • used:已使用内存
  • free:空闲内存
  • shared:共享内存
  • buff/cache:缓冲区和缓存(Linux会用空闲内存做缓存,提高性能,这部分内存可以被回收)
  • available:可用内存(包括可回收的缓存)

3. 磁盘监控

# 查看磁盘使用情况
df -h

# 查看inode使用情况
df -i

# 查看目录大小
du -sh /path/to/directory

# 查看当前目录下各子目录大小
du -sh */

# 查看磁盘IO统计
iostat -x 1

# 查看进程IO使用
iotop

# 查看磁盘挂载情况
mount

# 查看磁盘分区情况
fdisk -l
lsblk

# 查看文件系统类型
df -T

# 检查和修复文件系统
fsck /dev/sda1

4. 网络监控

# 查看网络接口信息
ifconfig
ip addr

# 查看网络接口统计
netstat -i
ip -s link

# 查看网络连接
netstat -tunlp

# 查看TCP连接状态统计
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

# 查看监听端口
ss -tunlp

# 实时查看网络流量
iftop

# 查看进程网络使用
nethogs

# 查看网络路由
route -n
ip route

# 测试网络连通性
ping baidu.com

# 测试端口连通性
telnet baidu.com 80
nc -zv baidu.com 80

# 查看DNS解析
nslookup baidu.com
dig baidu.com

# 查看网络请求路径
traceroute baidu.com

# 下载测试
wget -O /dev/null http://speedtest.tele2.net/10MB.zip
curl -o /dev/null http://speedtest.tele2.net/10MB.zip

5. 系统整体监控

# 查看系统信息
uname -a

# 查看系统版本
cat /etc/os-release

# 查看系统运行时间
uptime

# 查看系统负载
w

# 查看登录用户
who

# 查看用户登录历史
last

# 查看系统资源使用(综合)
vmstat 1 5

# 查看系统性能(综合,需要安装)
dstat

# 查看系统启动信息
dmesg

# 查看系统日志
journalctl

# 实时查看系统日志
journalctl -f

日志分析

日志是排查问题的重要依据,Linux系统和各种服务都会生成日志。

1. 系统日志

# 查看系统日志(systemd系统)
journalctl

# 查看最近的系统日志
journalctl -n 100

# 实时查看系统日志
journalctl -f

# 查看指定服务的日志
journalctl -u nginx

# 查看指定时间的日志
journalctl --since "2016-04-01" --until "2016-04-10"

# 查看内核日志
dmesg

# 查看传统系统日志(SysV系统)
cat /var/log/messages
cat /var/log/syslog

# 查看认证日志
cat /var/log/secure
cat /var/log/auth.log

# 查看系统启动日志
cat /var/log/boot.log

2. 常用日志查看命令

# 查看文件内容
cat /var/log/nginx/access.log

# 分页查看
less /var/log/nginx/access.log

# 查看文件末尾(默认10行)
tail /var/log/nginx/access.log

# 查看文件末尾指定行数
tail -n 100 /var/log/nginx/access.log

# 实时查看文件末尾
tail -f /var/log/nginx/access.log

# 查看文件开头
head /var/log/nginx/access.log

# 搜索文件内容
grep "error" /var/log/nginx/error.log

# 搜索时忽略大小写
grep -i "error" /var/log/nginx/error.log

# 显示匹配行的行号
grep -n "error" /var/log/nginx/error.log

# 显示匹配行的前后几行
grep -C 5 "error" /var/log/nginx/error.log

# 统计匹配行数
grep -c "error" /var/log/nginx/error.log

# 反向匹配(显示不包含的行)
grep -v "200" /var/log/nginx/access.log

# 多文件搜索
grep "error" /var/log/nginx/*.log

# 递归搜索目录
grep -r "error" /var/log/

# 组合使用(搜索错误并实时查看)
tail -f /var/log/nginx/error.log | grep "error"

# 日志统计(统计访问量前10的IP)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 统计访问量前10的URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 统计HTTP状态码
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

3. 日志轮转: 日志文件会越来越大,需要定期轮转和清理。logrotate是Linux系统常用的日志轮转工具。

配置文件 /etc/logrotate.conf/etc/logrotate.d/ 目录下的文件。

示例配置 /etc/logrotate.d/nginx

/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

配置说明:

  • daily:每天轮转
  • weekly:每周轮转
  • monthly:每月轮转
  • rotate 30:保留30个轮转文件
  • compress:压缩轮转文件
  • delaycompress:延迟压缩(下一次轮转时压缩)
  • missingok:日志文件不存在不报错
  • notifempty:空文件不轮转
  • create:创建新日志文件的权限和所有者
  • postrotate:轮转后执行的脚本

系统安全

1. 用户和权限管理

# 查看当前用户
whoami

# 查看用户信息
id

# 切换用户
su - username

# 以管理员身份执行命令
sudo command

# 创建用户
useradd username

# 创建用户并指定家目录和shell
useradd -m -s /bin/bash username

# 设置用户密码
passwd username

# 删除用户
userdel username

# 删除用户并删除家目录
userdel -r username

# 修改用户信息
usermod -aG groupname username

# 查看用户组
groups

# 创建用户组
groupadd groupname

# 删除用户组
groupdel groupname

# 修改文件所有者
chown username:groupname file

# 递归修改目录所有者
chown -R username:groupname directory

# 修改文件权限
chmod 755 file

# 递归修改目录权限
chmod -R 755 directory

# 查看文件权限
ls -l

2. SSH安全

# SSH配置文件
/etc/ssh/sshd_config

# 常用安全配置:
# 修改SSH端口(避免被扫描)
Port 2222

# 禁止root登录
PermitRootLogin no

# 禁止密码登录(使用密钥登录)
PasswordAuthentication no

# 允许的用户
AllowUsers username

# 重启SSH服务
systemctl restart sshd

3. 防火墙

# firewalld(CentOS 7+)
# 查看防火墙状态
systemctl status firewalld

# 启动防火墙
systemctl start firewalld

# 设置开机自启
systemctl enable firewalld

# 查看开放的端口
firewall-cmd --list-ports

# 开放端口
firewall-cmd --permanent --add-port=80/tcp

# 移除端口
firewall-cmd --permanent --remove-port=80/tcp

# 重新加载配置
firewall-cmd --reload

# iptables(通用)
# 查看规则
iptables -L -n

# 开放端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 保存规则
service iptables save

# ufw(Ubuntu)
# 查看状态
ufw status

# 启用防火墙
ufw enable

# 开放端口
ufw allow 80/tcp

# 关闭端口
ufw delete allow 80/tcp

实战经验和最佳实践

1. 定期更新系统

# CentOS
yum update

# Ubuntu/Debian
apt-get update && apt-get upgrade

2. 监控系统状态

  • 使用监控工具(如Zabbix、Prometheus、Grafana)监控系统状态
  • 设置告警,及时发现和处理问题
  • 定期查看系统日志,发现潜在问题

3. 定期备份

  • 定期备份重要数据和配置文件
  • 使用rsync、tar等工具备份
  • 备份文件要存放在不同的位置,最好异地备份
  • 定期测试备份的可用性

4. 性能优化

  • 根据应用特点调整系统参数(如文件描述符、网络参数等)
  • 使用缓存(如Redis、Memcached)提高性能
  • 优化数据库配置和查询
  • 使用CDN加速静态资源

5. 安全加固

  • 及时更新系统和软件,修复安全漏洞
  • 配置防火墙,只开放必要的端口
  • 使用强密码,定期更换密码
  • 禁止root远程登录,使用密钥登录
  • 定期检查系统日志,发现异常登录和攻击
  • 安装防病毒软件(如ClamAV)

总结

Linux系统管理是程序员的必备技能,掌握进程管理、服务管理、性能监控、日志分析、系统安全等知识,能让我们更好地管理和维护服务器,保障系统的稳定运行。

本文介绍了Linux系统管理的实战知识,包括进程管理(查看、终止、优先级、作业控制)、服务管理(systemd、service、自定义服务)、性能监控(CPU、内存、磁盘、网络、系统整体)、日志分析(系统日志、常用命令、日志轮转)、系统安全(用户权限、SSH安全、防火墙)以及实战经验和最佳实践。

Linux系统管理是一个需要不断学习和实践的领域,本文只是入门,还有很多高级知识等待我们去探索。希望这篇文章能帮助大家更好地使用和管理Linux系统,让服务器更加稳定、高效、安全。