[关闭]
@gy-ban 2017-05-21T07:24:49.000000Z 字数 3010 阅读 421

linux 进程相关知识

linux


进程process是指正在执行的程序;是程序正在运行的一个实例。它由程序指令,和从文件、其它程序中读取的数据或系统用户的输入组成。

进程的类型

在 Linux 中主要有两种类型的进程:

守护进程
这是后台进程的特殊类型,它们在系统启动时启动,并作为服务一直运行;它们不会死亡。它们自发地作为系统任务启动(作为服务运行)。但是,它们能被用户通过 init 进程控制。

Linux 中创建进程

在 Linux 中创建进程有三种方式:

fork() 方式
使用 fork() 函数以父进程为蓝本复制一个进程,其 PID号与父进程 PID 号不同。在 Linux 环境下,fork() 是以写复制实现的,新的子进程的环境和父进程一样,只有内存与父进程不同,其他与父进程共享,只有在父进程或者子进程进行了修改后,才重新生成一份。

system() 方式
system() 函数会调用 /bin/sh –c command 来执行特定的命令,并且阻塞当前进程的执行,直到 command 命令执行完毕。新的子进程会有新的 PID。

exec() 方式
exec() 方式有若干种不同的函数,与之前的 fork() 和 system() 函数不同,exec() 方式会用新进程代替原有的进程,系统会从新的进程运行,新的进程的 PID 值会与原来的进程的 PID 值相同。

如何识别进程

由于 Linux 是一个多用户系统,意味着不同的用户可以在系统上运行各种各样的程序,内核必须唯一标识程序运行的每个实例。

程序由它的进程 ID(PID)和它父进程的进程 ID(PPID)识别,因此进程可以被分类为:

init 进程
init 进程是系统中所有进程的父进程,它是启动 Linux 系统后第一个运行的程序;它管理着系统上的所有其它进程。它由内核自身启动,因此理论上说它没有父进程。

init 进程的进程 ID 总是为 1。它是所有孤儿进程的收养父母。(它会收养所有孤儿进程)。

查找进程 ID
可以用 pidof 命令查找某个进程的进程 ID

  1. [bhuser@boohee-qa ~]$ pidof top
  2. 27624
  3. [bhuser@boohee-qa ~]$ pidof mongod
  4. 2347
  5. [bhuser@boohee-qa ~]$ pidof mysqld
  6. 5810

Linux 中进程的状态

在执行过程中,取决于它的环境一个进程会从一个状态转变到另一个状态。在 Linux 中,一个进程有下面的可能状态:

如何在 Linux 中控制进程

Linux 中控制进程的基本方法是给它们发送信号。你可以发送很多信号给一个进程,运行下面的命令可以查看所有信号:

  1. [bhuser@boohee-qa ~]$ kill -l
  2. 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
  3. 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
  4. 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
  5. 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
  6. 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
  7. 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
  8. 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
  9. 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
  10. 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
  11. 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
  12. 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
  13. 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
  14. 63) SIGRTMAX-1 64) SIGRTMAX

要给一个进程发送信号,可以使用 kill、pkill 或 pgrep 命令。但只有被编程为能识别这些信号时程序才能响应这些信号。

大部分信号都是系统内部使用,或者给程序员编写代码时使用。下面是一些对系统用户非常有用的信号:

SIGHUP 1 – 当控制它的终端被被关闭时给进程发送该信号。
SIGINT 2 – 当用户使用 Ctrl+C 中断进程时控制它的终端给进程发送这个信号。
SIGQUIT 3 – 当用户发送退出信号 Ctrl+D 时给进程发送该信号。
SIGKILL 9 – 这个信号会马上中断(杀死)进程,进程不会进行清理操作。
SIGTERM 15 – 这是一个程序终止信号(kill 默认发送这个信号)。
SIGTSTP 20 – 它的控制终端发送这个信号给进程要求它停止(终端停止);通过用户按 Ctrl+Z 触发。

如果我们要终止僵死的mysql进程,可以这样

  1. [bhuser@boohee-qa ~]$ pidof mysqld
  2. 5810
  3. [bhuser@boohee-qa ~]$ kill -9 5810
  4. [bhuser@boohee-qa ~]$ kill -KILL 5810

也可以通过应用名称

  1. $ pkill mysqld
  2. $ killall mysqld

Linux 进程优先级

在 Linux 系统中,所有活跃进程都有一个优先级以及 nice 值(默认值为0)。nice值越小的进程一般会获得更多的 CPU 时间。

但是,有 root 权限的系统用户可以使用 nice 和 renice 命令影响(更改)优先级。

在 top 命令的输出中, NI这一栏显示了进程的 nice 值

使用 nice 命令为一个进程设置 nice 值。记住一个普通用户可以给他拥有的进程设置 0 到 20 的 nice 值。

只有 root 用户可以使用负的 nice 值。
要重新设置一个进程的优先级,像下面这样使用 renice 命令:

  1. renice +8 5810

有关linux进程调度原理可以参考这篇文章

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注