服务卡死了要重启、凌晨要自动备份——这些都离不开进程管理和定时任务。本篇把这两块一次讲清。
在 Linux 眼里,你运行的每一个程序(nginx、mysql、甚至你敲的 ls)都是一个进程(process),系统给每个进程发一个唯一的 PID(进程 ID)。理解进程,你才能”看见”系统里在发生什么,并在出问题时精准干预。
进程的相关概念及命令
查看进程:ps
ps aux # 查看系统所有进程(最常用)
ps aux | grep nginx # 只看 nginx 相关进程
ps -ef # 另一种格式,显示父进程 PPID
ps aux 输出里几个关键列:
USER:谁跑的PID:进程 ID(杀进程要用它)%CPU/%MEM:占用 CPU / 内存百分比COMMAND:启动命令
动态监控:top / htop
ps 是”拍快照”,top 是”实时监控”——进程列表会动态刷新,按 CPU 占用排序,一眼看出谁在吃资源:
top # 实时刷新,按 q 退出
htop # top 的增强版(需安装,更直观、可鼠标操作)
top 里按 P 按 CPU 排序、M 按内存排序。服务器卡顿时,第一反应就是 top 看看是不是某个进程把 CPU/内存吃满了。
进程状态
ps 输出的 STAT 列表示状态,常见的有:
R:运行中(Running)S:睡眠(Sleep,等待事件,正常)D:不可中断睡眠(通常在等磁盘 IO)Z:僵尸进程(Zombie,已结束但父进程没回收,一般无害,大量出现要查)T:暂停(Stopped,比如被Ctrl+Z挂起)
控制进程:信号
Linux 不直接”杀”进程,而是给它发信号(signal),进程收到信号后按信号的约定行事。常用信号:
| 信号 | 编号 | 含义 |
|---|---|---|
SIGTERM | 15 | 优雅终止(默认,kill 发送),进程有机会清理后退出 |
SIGKILL | 9 | 强制杀死(无法被忽略),立即结束,不给清理机会 |
SIGINT | 2 | 中断(等同 Ctrl+C) |
SIGHUP | 1 | 挂断,常用于”重新加载配置”(不重启服务) |
发信号的命令
kill 1234 # 给 PID 1234 发 SIGTERM(15),请它退出
kill -9 1234 # 强制杀死(9),万不得已才用
killall nginx # 按进程名杀所有 nginx
pkill -u tom # 杀掉 tom 用户的所有进程
经验:先
kill PID(温和),进程不响应再kill -9 PID(强制)。kill -9太暴力,可能导致数据没保存,只在卡死时用。
前后台与作业控制
command & # 在后台运行(加 &)
jobs # 看当前 shell 的后台任务
fg %1 # 把后台任务 1 拉回前台
Ctrl+Z # 暂停当前前台任务
bg %1 # 让暂停的任务在后台继续跑
nohup command & # 退出终端后依然运行(nohup 忽略挂断信号)
nohup command & 特别实用:你 SSH 连上服务器跑一个长时间任务,用 nohup 起,然后断开 SSH,任务还在后台跑。
定时任务:cron
很多事要”定时自动做”:每天凌晨备份、每小时清理日志、每周发报表。cron 就是 Linux 的”定时闹钟”。
crontab 语法
crontab -e # 编辑当前用户的定时任务
crontab -l # 列出已有任务
crontab -r # 删除所有任务(慎用!)
crontab -e 里每行是一个任务,格式是 5 个时间字段 + 命令:
分 时 日 月 周 命令
* * * * * command
| 字段 | 范围 | 含义 |
|---|---|---|
| 分 | 0-59 | 第几分钟 |
| 时 | 0-23 | 第几小时 |
| 日 | 1-31 | 几号 |
| 月 | 1-12 | 几月 |
| 周 | 0-7 | 星期几(0 和 7 都是周日) |
* 表示”每”,, 表示列举,/ 表示步长。例子:
30 2 * * * /backup.sh # 每天凌晨 2:30 执行备份
0 */2 * * * /clean.sh # 每隔 2 小时(0,2,4...)执行清理
*/5 * * * * /check.sh # 每 5 分钟检查一次
0 0 * * 0 /weekly.sh # 每周日零点
注意事项
- 命令最好写绝对路径(cron 的环境变量很少,相对路径可能找不到)。
- 输出默认会邮件发给你,想丢弃就加
> /dev/null 2>&1:30 2 * * * /backup.sh > /dev/null 2>&1 - 系统级定时任务在
/etc/crontab和/etc/cron.d/,格式多一个”用户”字段。
常见新手坑
kill不掉进程:它可能忽略了 SIGTERM,用kill -9强制;若仍是僵尸(Z),得杀它父进程。top里 CPU 100% 慌了:先看是哪个进程、是不是正常业务高峰,别盲目杀。- cron 任务不执行:多半是命令用了相对路径、或没写绝对路径;看
/var/log/cron日志排查。 nohup后终端关了任务还挂:确认用了&且nohup,输出重定向到文件。
这一篇你该记住的
- 程序运行起来叫进程,每个有唯一 PID;
ps aux看快照、top看实时(谁吃资源一目了然)。 - 控制进程靠”发信号”:
kill PID温和终止(15),kill -9 PID强制(9) 万不得已才用;killall/pkill按名杀。 - 前后台:
&后台、jobs/fg/bg切换、nohup command &断开终端仍运行。 - cron 定时任务:
crontab -e编辑,格式分 时 日 月 周 命令,*=每、/=步长;命令用绝对路径。
下一篇我们搭第一个对外服务——用 Apache(HTTPD) 把网站跑起来,并认识 LAMP 全家桶。