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.2.1 kill

kill [信号] PID/Job_Spec

  • -l 查看信号变量
1)  SIGHUP  重载配置,PID不变
2)  SIGINI  键盘中断,^C
3)  SIGQUIT 键盘退出
9)  SIGKILL 强制杀死
15) SIGTERM 终止,缺省信号
18) SIGCONT 继续
19) SIGSTOP 停止
20) SIGTSTP 暂停,^Z

15.2.2 killall

killall [信号] 进程名

15.2.3 pkill

pkill -u alice 终止alice用户的所有进程

pkill -t pts/2 终止pts/2上的所有进程

pkill -9 -t pts/2 终止pts/2上的所有进程,并结束pts/2

此时w命令可以看到已经没有pts/2了

15.3 调度策略

15.3.1

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.2 后台任务

后台运行并丢弃输出:

(while :; do date; sleep 2; done) &>/dev/null &

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 重启任务调度

15.5.1 cron 表达式

以五位的Cron表达式为例,分别表示分时日月周

其中,每个字段都要取整数

注意:

  • 星期是0-6,0表示周日
  • 月的31号要考虑实际情况
  • “日”和“星期”字段为“或”关系,即两者均生效

特殊符号:

符号 含义
, 取并集。例如在“小时”字段1,2,3 表示1点、2点和3点
- 取范围。例如0 5 * * 1-6代表每周一到周六5点执行
* 取任意。例如在“小时”字段中,* 表示每个小时
*/n 取间隔。例如*/10 * * * *代表每隔10分钟一次

15.5.2 at

at命令是一次性计划任务,at的守护进程std会以后台模式运行

默认情况下,atd每60秒检查作业队列

在使用at命令时,要保证atd的正常运行

  • at [选项] [时间]
  • Ctrl +d 结束at命令的输入