1. Linux进程管理基础
在Linux系统中,进程是程序执行的基本单位。理解进程管理是系统管理员和开发人员的必备技能。当我们执行一个命令或启动一个程序时,系统会为其创建一个进程,分配资源并维护其运行状态。
1.1 进程查看与监控
最常用的进程查看命令是ps和top。ps提供静态快照,而top则是动态实时显示:
bash复制# 查看当前用户的所有进程
ps -u
# 查看系统所有进程的完整信息
ps -ef
# 动态监控进程状态
top
在top界面中,几个关键指标值得关注:
- %CPU:进程占用的CPU百分比
- %MEM:进程占用的内存百分比
- TIME+:进程运行的总CPU时间
- COMMAND:进程对应的命令
提示:在top界面中按'M'可按内存使用排序,按'P'可按CPU使用排序,按'q'退出。
1.2 进程控制命令
进程控制是系统管理的核心操作之一:
bash复制# 正常终止进程(发送SIGTERM信号)
kill [PID]
# 强制终止进程(发送SIGKILL信号)
kill -9 [PID]
# 按名称终止进程
pkill [进程名]
# 终止所有匹配的进程
killall [进程名]
有时会遇到killall无法终止进程的情况,这通常是因为:
- 进程处于僵尸状态(Z状态)
- 进程被锁定或正在执行关键操作
- 权限不足(需要root权限)
解决方案是:
bash复制# 检查进程状态
ps aux | grep [进程名]
# 如果确实是僵尸进程,可以尝试终止其父进程
kill -9 [PPID]
1.3 进程优先级管理
Linux使用nice值调整进程优先级,范围从-20(最高)到19(最低):
bash复制# 启动时设置优先级
nice -n 10 command
# 修改运行中进程的优先级
renice 15 -p [PID]
在实际生产环境中,数据库服务等关键进程通常设置为较高的优先级(如-5到-10),而批处理任务可以设置为较低的优先级(10以上)。
2. 后台进程与作业控制
2.1 前后台切换
在Linux终端中,进程可以运行在前台或后台:
bash复制# 启动后台进程
command &
# 将正在运行的前台进程放到后台
Ctrl+Z # 先暂停
bg %1 # 再后台运行
# 查看后台作业
jobs
# 将后台作业调回前台
fg %1
2.2 nohup与disown
当终端退出时,默认会终止所有子进程。要保持进程运行,可以使用:
bash复制# 使用nohup忽略挂断信号
nohup command &
# 或者使用disown
command &
disown %1
两者的区别在于:
nohup在启动时就设置忽略挂断信号disown是在进程运行后将其从作业列表中移除
2.3 screen与tmux
对于需要长时间运行的进程,建议使用终端复用器:
bash复制# 使用screen
screen -S session_name
command
Ctrl+A D # 分离会话
screen -r session_name # 恢复会话
# 使用tmux
tmux new -s session_name
command
Ctrl+B D # 分离会话
tmux attach -t session_name # 恢复会话
3. 计划任务管理
3.1 cron基础
cron是Linux中最常用的计划任务工具,由crond守护进程实现:
bash复制# 编辑当前用户的cron任务
crontab -e
# 列出cron任务
crontab -l
# 删除所有cron任务
crontab -r
cron时间格式为:
code复制* * * * * command
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └── 星期几 (0 - 6) (0是周日)
│ │ │ └──── 月份 (1 - 12)
│ │ └────── 日 (1 - 31)
│ └──────── 小时 (0 - 23)
└────────── 分钟 (0 - 59)
3.2 cron高级用法
-
范围与步长:
bash复制# 每天9点到18点每小时执行 0 9-18 * * * command # 每10分钟执行一次 */10 * * * * command -
环境变量问题:
cron执行环境与用户环境不同,建议:bash复制# 在cron中设置PATH PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # 或者使用完整路径 /usr/bin/command -
输出处理:
bash复制# 重定向输出到文件 * * * * * command > /var/log/command.log 2>&1 # 丢弃输出 * * * * * command > /dev/null 2>&1
3.3 系统级cron
系统级cron任务存放在以下目录:
bash复制/etc/crontab
/etc/cron.d/
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
与用户级cron的区别:
- 需要指定执行用户
bash复制* * * * * username command - 修改后不需要重新加载
- 通常用于系统维护任务
3.4 anacron
对于不24小时运行的机器,anacron可以补充cron的不足:
bash复制# 安装anacron
sudo apt install anacron
# 配置示例(/etc/anacrontab)
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly
字段说明:
- 天数:执行间隔天数
- 延迟:启动后延迟分钟数
- 任务标识符
- 命令
4. 进程间通信(IPC)
Linux提供了多种进程间通信机制:
4.1 常见IPC方式
| 通信方式 | 描述 | 适用场景 |
|---|---|---|
| 管道 | 单向数据流 | 父子进程简单通信 |
| 命名管道 | 文件系统可见的管道 | 无亲缘关系进程 |
| 信号 | 异步事件通知 | 进程控制 |
| 消息队列 | 结构化数据传递 | 需要可靠通信的场景 |
| 共享内存 | 高效的大数据共享 | 需要高性能数据交换 |
| 信号量 | 进程同步 | 资源访问控制 |
| 套接字 | 网络通信 | 跨主机进程通信 |
4.2 共享内存示例
c复制#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
int main() {
// 创建共享内存段
int shmid = shmget(IPC_PRIVATE, 1024, 0666|IPC_CREAT);
// 附加到进程地址空间
char *shm = shmat(shmid, NULL, 0);
// 写入数据
sprintf(shm, "Hello, shared memory!");
// 读取数据
printf("Data read from shared memory: %s\n", shm);
// 分离共享内存
shmdt(shm);
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
4.3 消息队列示例
c复制#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
struct msg_buffer {
long msg_type;
char msg_text[100];
};
int main() {
key_t key = ftok("progfile", 65);
int msgid = msgget(key, 0666 | IPC_CREAT);
struct msg_buffer message;
message.msg_type = 1;
strcpy(message.msg_text, "Hello Message Queue!");
msgsnd(msgid, &message, sizeof(message), 0);
printf("Data sent: %s\n", message.msg_text);
msgrcv(msgid, &message, sizeof(message), 1, 0);
printf("Data received: %s\n", message.msg_text);
msgctl(msgid, IPC_RMID, NULL);
return 0;
}
5. 实战案例与故障排查
5.1 宝塔面板计划任务执行失败
常见原因及解决方案:
-
权限问题:
bash复制# 确保脚本有执行权限 chmod +x /path/to/script.sh # 检查cron服务是否运行 systemctl status cron -
环境变量问题:
bash复制# 在脚本中设置PATH #!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin -
路径问题:
bash复制# 使用绝对路径 * * * * * /full/path/to/command -
日志检查:
bash复制# 查看cron日志 grep CRON /var/log/syslog
5.2 进程资源监控脚本
以下脚本可监控进程资源使用情况:
bash复制#!/bin/bash
# 监控特定进程的资源使用
process_name="$1"
log_file="/var/log/process_monitor.log"
while true; do
timestamp=$(date "+%Y-%m-%d %H:%M:%S")
stats=$(ps aux | grep "$process_name" | grep -v grep | awk '{print $3,$4,$6/1024"MB"}')
if [ -z "$stats" ]; then
echo "[$timestamp] Process $process_name not found" >> "$log_file"
else
echo "[$timestamp] CPU%: ${stats%% *}, MEM%: ${stats#* }, RSS: ${stats##* }" >> "$log_file"
fi
sleep 60
done
使用方法:
bash复制./process_monitor.sh nginx
5.3 僵尸进程处理
僵尸进程是已终止但未被父进程回收的进程。处理方法:
-
查找僵尸进程:
bash复制ps aux | grep 'Z' -
终止父进程:
bash复制kill -HUP [PPID] -
如果父进程是init(pid=1),需要重启系统才能清除。
5.4 进程文件描述符泄漏检测
bash复制# 查看进程打开的文件描述符数量
ls -l /proc/[PID]/fd | wc -l
# 查看系统文件描述符限制
ulimit -n
# 临时提高限制
ulimit -n 65536
对于长期运行的服务,建议使用lsof定期检查:
bash复制lsof -p [PID] | wc -l
