进程管理
进程组
一个或多个进程 的集合
作业
一个或多个进程 的集合
- shell可以进行作业控制,可以运行一个前台作业和多个后台作业
 - 如果作业中的某个进程又创建了子进程,则子进程不属于该作业
 - 作业运行结束后如果前台进程不存在,shell就把自己提到前台
 
会话
一个或多个进程组 的集合
- 通常一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期
 - 会话包括控制进程(会话首进程),一个前台进程组和任意多个后台进程组
 - 一个会话只能有一个控制终端 ,控制终端上的输入和信号将发送给会话的前台进程组中的所有进程
 
进程类型
进程状态,详情参见这里
| 状态 | 说明 | 
|---|---|
| D | Uninterruptible sleep (usually IO) | 
| R | Running or runnable (on run queue) | 
| S | Interruptible sleep (waiting for an event to complete) | 
| T | Stopped, either by a job control signal or because it is being traced | 
| 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 | 
前台进程
一般默认在shell中启动的进程就是前台进程
后台进程
脱离终端在后台执行的程序,通常以d结尾
僵尸进程
父进程没有获取子进程退出状态信息的子进程
后台进程
使用ctrl + z快捷键可以将前台进程变为后台进程
[root@zhujipeng /]# sleep 60
^Z
[1]+  Stopped                 sleep 60
[root@zhujipeng /]# jobs
[1]+  Stopped                 sleep 60
[root@zhujipeng /]# bg
[1]+ sleep 60 &
[root@zhujipeng /]# fg
sleep 60
^C
命令后面使用 & 符号可以将进程变为后台进程
[root@zhujipeng /]# sleep 60 &
[1] 28
[root@zhujipeng /]# jobs
[1]+  Running                 sleep 60 &
[root@zhujipeng /]# kill -9 %1
[root@zhujipeng /]# jobs
[1]+  Killed                  sleep 60
nohup
会话中前台进程会收到SIGHUP信号而终止,后台进程则由huponexit参数决定
[root@zhujipeng /]# shopt | grep huponexit
huponexit          off
SIGHUP会在以下3种情况下被发送给相应的进程,详见这里
- 终端关闭时,该信号被发送到session首进程以及作为job提交的进程(&提交的进程)
 - session首进程收到信号退出时,该信号被发送到该session前台进程组中的每一个进程
 - 若进程组是孤儿进程组并且有进程处于停止状态,该信号被发送到该进程组中的每一个进程
 
进程处于停止状态是收到了
SIGSTOP或SIGTSTP信号
守护进程
守护进程是指忽略了SIGHUP信号的进程,启动方法参见这里和这里
进程信号
信号(signal)就是一种向进程传递信息的方式,详见这里
[root@zhujipeng /]# kill -l
 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX
0号信号是测试信号,可以检测进程是否存在
信号的响应
- 中止进程(Term)
 - 忽略信号(Ign)
 - 中止进程并保存内存信息(Core)
 - 停止进程(Stop)
 - 继续运行进程(Cont)
 
常见的信号
| 信号名 | 信号值 | 动作 | 说明 | 
|---|---|---|---|
| SIGHUP | 1 | Term | 终止进程(可以被捕获、阻塞或忽略) | 
| SIGINT | 2 | Term | 中断 (INTERRUPT) 进程(可以被捕获、阻塞或忽略) | 
| SIGQUIT | 3 | Core | 退出 (QUIT) 进程(可以被捕获、阻塞或忽略) | 
| SIGILL | 4 | Core | 非法指令(程序错误、试图执行数据段、栈溢出等) | 
| SIGABRT | 6 | Core | 调用abort函数触发 | 
| SIGFPE | 8 | Core | 算术运行错误(浮点运算错误、除数为零等) | 
| SIGKILL | 9 | Term | 杀死(KILL)进程(不能被捕获、阻塞或忽略) | 
| SIGSEGV | 11 | Core | 无效内存引用(试图访问不属于自己的内存空间、对只读内存空间进行写操作) | 
| SIGPIPE | 13 | Term | 消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作) | 
| SIGALRM | 14 | Term | 时钟定时信号 | 
| SIGTERM | 15 | Term | 结束(TERMINAL)进程(可以被捕获、阻塞或忽略) | 
| SIGUSR1 | 30,10,16 | Term | 用户保留 | 
| SIGUSR2 | 31,12,17 | Term | 用户保留 | 
| SIGCHLD | 20,17,18 | Ign | 子进程结束(由父进程接收) | 
| SIGCONT | 19,18,25 | Cont | 继续执行已经停止的进程(不能被阻塞) | 
| SIGSTOP | 17,19,23 | Stop | 停止进程(不能被捕获、阻塞或忽略) | 
| SIGTSTP | 18,20,24 | Stop | 停止进程(可以被捕获、阻塞或忽略) | 
| SIGTTIN | 21,21,26 | Stop | 后台程序从终端中读取数据时触发 | 
| SIGTTOU | 22,22,27 | Stop | 后台程序向终端中写数据时触发 | 
信号快捷键
[root@zhujipeng /]# stty -a
speed 38400 baud; rows 26; columns 115; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
| 信号 | 快捷键 | 
|---|---|
| SIGINT | CTRL+C | 
| SIGQUIT | CTRL+\ | 
| SIGTSTP | CRTL+Z | 
CRTL+D是发送特殊的EOF字符
进程信息
/proc下存在一些以进程id命名的文件,详情参见这里
[root@zhujipeng /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 12:03 pts/0    00:00:00 /bin/bash
root       235     0  0 13:14 ?        00:00:00 /sbin/udevd -d
root       248     0  0 13:16 pts/2    00:00:00 bash
root       288   248  0 14:38 pts/2    00:00:00 ps -ef
[root@zhujipeng /]# ls /proc/1
attr        comm             fd         maps        ns             projid_map  smaps    task
autogroup   coredump_filter  fdinfo     mem         oom_adj        root        stack    timers
auxv        cpuset           gid_map    mountinfo   oom_score      sched       stat     timerslack_ns
cgroup      cwd              limits     mounts      oom_score_adj  schedstat   statm    uid_map
clear_refs  environ          loginuid   mountstats  pagemap        sessionid   status   wchan
cmdline     exe              map_files  net         personality    setgroups   syscall
fork
由fork创建的新进程被称为子进程(child process),详情见fork出的子进程和父进程
参考
进程、进程组、作业、会话
戏说守护、僵尸、孤儿进程
孤儿进程与僵尸进程 
Linux后台任务的运行、查看和关闭
Linux 守护进程的启动方法
让进程在后台可靠运行的几种方法
Linux 守护进程的实现
Linux ssh exit,启动的后台进程不会停止
SIGHUP信号与控制终端
Linux信号基础 
linux内核中异步通知机制--信号处理机制
Linux信号处理机制
Linux中ctrl-c, ctrl-z, ctrl-d 区别
Linux进程的Uninterruptible sleep
Linux查看进程的启动和运行相关的文件
fork出的子进程和父进程 
shell中的fork、source和exec总结
What does kill -0 do