Chapter 15 进程管理
进程标识:PID (process identifier), PPID (parent PID)
进程的生命周期:
父进程复制自己的地址空间(fork),创建一个新的进程结构并分配唯一的进程ID (PID), 满足跟踪安全性之需。
PID和父进程ID(PPID),是子进程环境的元素任何进程都可以创建子进程,所有进程都是一个第一个系统进程的后代:
CentOS 5/6: init
CentOS 7: systemd
[root@Cent-KVM cent]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─irqbalance
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec自己的程序代码。通常父进程在子进程运行期间处于睡眠状态(sleeping)状态。当子进程完成时发出exit信号请求,释放除了PID之外的所有资源,剩余的部分称之为僵尸(zombie)。父进程在子进程推出时收到信号而被唤醒,清理剩余的结构,然后继续执行自己的程序代码
15.1 信息查看
15.1.1 ps
process status
ps -ef :使用标准语法查看每个进程
-e:Select all processes
-f:Do full-format listing
UID | PID | PPID | C | STIME | TTY | TIME | CMD
ps aux :使用BSD语法查看每个进程
ax:list all processes (BSD-style)
u:Display user-oriented format(显示更多信息)
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | CMD |
---|
VSZ: 占用虚拟内存,单位KiB
RSS: 占用实际内存(驻留内存)
TTY: 进程运行的终端
STAT: 进程状态
D
uninterruptible sleep (usually IO) 不可中断睡眠,通常在执行IO操作R
running or runnable (on run queue) 运行S
interruptible sleep (waiting for an event to complete) 可中断睡眠(等待)T
stopped by job control signal 停止t
stopped by debugger during the tracing 停止W
paging (not valid since the 2.6.xx kernel)X
dead (should never be seen) 死掉(不可能看到)Z
defunct (“zombie”) process, terminated but not reaped by its parent 僵尸进程
BSD格式还可能会有以下符号
- <
high-priority (not nice to other users) 高优先级
N
low-priority (nice to other users) 低优先级
L
has pages locked into memory (for real-time and custom IO)
s
is a session leader 会话领导,父进程
l
is multi-threaded 多线程
+
is in the foreground process group 前台进程组
TIME: 累积使用的CPU时间
排序:
ps aux --sort -%cpu
dash表示降序
ps aux --sort -time | less
ps auxf
可查看层级结构
/usr/sbin/sshd -D
\_ sshd: root@pts/0
\_ -bash
\_ ps auxf
ps auxf | grep httpd
自定义显示字段
pa axo pid,ppid,user,%cpu,command
ps axo user,pid,ppid,%mem,%cpu,command --sort -%cpu | less
15.1.2 top
The top program provides a dynamic real-time view of a running system.
load average:最近1, 5, 15 分钟平均负载
数值除以cpu个数是每个cpu的负载
%Cpu(s):us用户态,sy内核态,id空闲
top 参数
- -d secs 刷新间隔
- -p pid1,pid2 只看列出的进程
- -u user 查看指定用户的进程
- -b -n 2 > top.txt 将两次输出保存到文件
交互:
- Enter 立即刷新
- 1 查看每个CPU的情况
- < 向前
- > 向后
- M (大写) 按照内存使用排序
- P (大写) 按照cpu占用排序
- R (大写) 反转排序
- h/?帮助
- f 自定义显示字段
- z 彩色
- W (大写) 保存环境设置
- k 发送信号
15.2 信号控制
15.4 作业控制
前台进程(foreground):前台进程是在终端中运行的命令,该终端称为进程的控制终端(controlling terminal)
后台进程(background):后台进程没有控制终端,不需要终端交互
15.4.1 jobs fg bg kill
&
执行命令时,让其在后台执行,
sleep 3000 &
^Z
将前台的服务挂起(stop)到后台
jobs
Display status of jobs.
fg job_spec
Move job to the foreground.
bg job_spec
Move jobs to the background, as if they had been started with
&
.kill job_spec
Send a signal to a job.
举例:
[root@Cent-KVM ~]# sleep 4000 &
[4] 3612
[root@Cent-KVM ~]# jobs
[1] Running sleep 1000 &
[2] Running sleep 2000 &
[3]- Running sleep 3000 &
[4]+ Running sleep 4000 &
[root@Cent-KVM ~]# fg 4
sleep 4000
^C
[root@Cent-KVM ~]# kill %3
[root@Cent-KVM ~]# kill -9 %2
[root@Cent-KVM ~]# fg
sleep 1000
^Z
[1]+ Stopped sleep 1000
[root@Cent-KVM ~]# ps axo user,pid,stat,command | grep sleep
root 3609 T sleep 1000
[root@Cent-KVM ~]# bg
[1]+ sleep 1000 &
[root@Cent-KVM ~]# ps axo user,pid,stat,command | grep sleep
root 3609 S sleep 1000
# vim a.txt
1111
这时有其他事情要做,按^Z把vim切到后台
完成之后:
# fg
fg会把最近一个挂起的作业移动到前台
15.4.3 screen
yum -y install screen
GNU Screen是一款用于命令行终端切换的自由软件,提供了会话恢复、多窗口、会话共享等功能
在screen下远程终端运行程序时,即使不小心踢掉网线(dog),程序也不会中断,下次登录可以重连
-S sockname
新建一个名为
<pid>.sockname
的会话-list
列出会话
-r session_pid
重新连接一个会话
-X -S session_pid quit
杀死该会话
screen内的快捷键:
所有快捷键以
^A
开始,使用快捷键时,应当先按一下
^A
组合建,然后按以下命令- c 创建并切换到新窗口
- d detach,分离当前窗口
- k 杀死当前窗口
- 0~9 在第0~9号窗口间切换
- n 切换到下一个窗口
- p 切换到上一个窗口
- ^A 切换到刚才的窗口
- a 相当于在bash中按
^A
- [ 进入复制模式,使用HL0$wb以及方向键PgUpPgDn移动,空格标记
- ] 粘贴
注意:detach快捷键要先按^A
,然后按d
,不要手贱按到^D
退出
15.5 计划任务 crond
crontab 进行定时任务的设置
-e:编辑crontab定时任务
-l:查询crontab定时任务
-r:终止任务调度
service crond restart 重启任务调度