写在前面:
进程会借由父进程以复制的方式产生一个一摸一样的子进程,然后复制出来的子进程再以exec的方式来执行实际要执行的进程, 最终就成为一个子进程。
一 job control管理
1 后台执行命令 &
执行后, 系统会告诉你job number, 执行完还会告诉你执行完毕
tar -zpcf /tmp/etc.tar.gz /etc/ &
tar -zpcvf /tmp/etc.tar.gz /etc/ > /tmp/log.txt 2>&1 &
加个v会在屏幕显示, 所以要用数据流重定向
2 将目前的任务放到后台暂停, ctrl + z
vim ~/ .bashrc
# 在一般模式下 按 ctrl + z
# 将这个任务暂停放到后台
3 查看目前的后台状态 jobs
-l 除了列出job numbers与命令串之外,同时列出PID号码
-r 仅列出正在后台run的任务
-s 仅列出正在后台中暂停的任务
+代表默认的食用任务,最近放到后台的任务, - 代表第二个被放到后台的任务号码
job -l
[1] - 14566 Stopped vim ~/.bashrc
[2] + 14567 Stopped find / -print
4 将后台任务放到前台处理 fg
jobs -l
fg # 默认取出的是带+号的任务,即执行最新添加的任务
fg %1 # 取出job号为1的job
fg - # 执行-的任务, 就是倒数第二新的任务
5 让任务在后台下的状态变成运行中 bg
jobs
bg %3 让暂停的3号job变成运行状态
6 管理后台的任务kill
kill -signal %jobnumber
kill -l 列出可选的所有信号
signal:
-1 重新读取一次参数配置的文件
-2 代表由键盘输入ctrl + c
-9 立刻删除一个任务
-15 以正常的进程方式终止一项任务
kill -9 %2 杀死job号是2的
kill -SIGTERM %2 等价于 kill -15 %2
kill pid 直接加进程号也行
7 killall
-i 删除是会有提示
-I 大写i, 忽略大小写
killall -1 rsyslogd 给这个命令一个信号
killall -9 xx
kill 和 killall 的差别!
kill 后面只能加pid 或者 job号, 也就是说只能删除一个进程
而killall 后面加一个命令, 可以删除以这个命令启动的所有进程
8 脱机运行 nohup
用&执行命令, 虽然放到后台运行任务, 但是,一旦关了终端,任务就终止了。所以要用
nohup ....... & 一直让任在后台务运行, 我云上部署的django就是这个命令
nohup ....... 一直让任务在前台运行
二 进程管理
1 ps
-A 显示所有的进程
-a 不显示与终端有关的进程
-u 有效使用者的相关进程
x 列出完整的信息
主要记住这两个就好了:
ps aux 查看所有的系统运行的进程
ps -l 只能查看自己bash的进程
ps -l
[root@ ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 15054 15051 0 80 0 - 28894 do_wai pts/1 00:00:00 bash
0 R 0 15981 15054 0 80 0 - 38309 - pts/1 00:00:00 ps
F: 代表这个进程标识,说明这个进程的权限,常见号码:
4:进程权限为root
1: 表示此子进程仅执行复制而没有执行
0:既不是fork之后未执行的进程,也不是使用的超级用户权限
S: 代表状态
R: 该进程正在运行中
S: 该进程正在睡眠状态,可以被signal唤醒
D: 不可被唤醒的睡眠状态,通常这个进程可能在等待I/O的情况
T: 停止状态
Z: 僵尸状态,僵尸进程, 进程终止但却无法删除至内存外
C: cpu 李勇百分比
PRI/NI: 优先级
ps aux
[root@ ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S Aug14 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Aug14 1:28 [ksoftirqd/0]
STAT: 进程状态
ps aux 默认会按pid排序
2 top 动态查看进程变化
默认是按cpu使用率排序的
-d 后面接秒数, 就是整个进程界面更新秒数,默认是5秒
-b 以批量的方式执行top
-n 与-b搭配,需要执行几次top输出的结果
-p 指定某些个PID来执行检测
在执行top可以使用的按键命令:
? 显示top可以输入的按键命令
P 以cpu使用排序显示
M 以Memory排序
N 以PID排序
T 以进程的使用的CPU时间累积排序
k 给予某个pid一个信号
r 给予某个pid重新定一个nice值
q 退出top
输入 top -d 2 制定没两秒刷新一次
第一行(top开始的):目前时间 ,开机到目前的时间,登陆的用户人数,系统在1,5,15分钟的平局任务负载
第二行: 显示当前的进程总量,和个别进程的状态
第三行: 显示cpu的负载 wa 是 I/O wait
第四第五行: 表示物理内存和虚拟内存
top的下半部分:
PR: 进程的优先级别,越小优先级越高, 系统自动生成的用户没法改
NI: 也是进程的优先级, 越小优先级越高, 用户可以自己修改, 所以总的优先级PR+NI
echo $$ 看当前bash的pid
14836
top -d 2 -p 14836 看指定pid的进程
按r调NI
3 pastree 查看进程树
进程树可以看到一个进程的父进程
-A 指定字符为ASCII
-U 指定字符为Unicode
-p 同时列出每个pid
-u 列出每个进程的所属账号关系
三 关于进程的优先级
PRI是内核动态调整的,用户无法修改,
NI, 用户可以修改。
NI:
- 取值范围 -20 ~ 19
- root可调整自己和其他人的NI
- 其他人只能调整自己的, 范围0~19, 且不能调小
调整NI有两个命令:nice 和 renice
1 nice 命令创建时指定
-n 一个数, -20 ~ 19
nice -n -5 vim & 指定这个命令创建的进程NI=5
2 renice 对已经存在的nice重新调整, 后面接pid
-pid
renice -5 pid 直接加数字,这个是-5, 再加pid
四 netstat 追踪网络或scoket
-a 将目前系统上所有的连接,监听,socket信息都列出来
-t 列出tcp网络封包信息
-u 列出udp网络封包信息
-n 不以进程服务名称,以端口号来显示
-l 列出目前正在网络监听的服务
-p 列出该网络服务的进程pid
netstat -anp | grep 服务的名字
netstat -lnp | grep 端口号