It's our wits that make us men.

2019/4/5 Linux进程相关知识点

Posted on By LuLu

Linux进程相关知识点

​ 进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,所关心的是如何去控制这些进程,让它们能够很好地为用户服务。

​ Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个进程序列。监控进程(也称系统守护进程)时Linux系统启动时启动的进程,并在后台运行。例如,httpd是著名的Apache服务器的监控进程。

进程查看
  • ps ax : 显示当前系统进程的列表

  • ps aux : 显示当前系统进程详细列表以及进程用户

  • ps ax less : 如果输出过长,可能添加管道命令 less查看具体进程, 如:ps ax grep XXX(XXX为进程名称)

    img

获取进程id

shell获取进程ID的方法:

  ps -A grep “cmdname” awk ‘{print $1}’

  pidof “cmdname”

  pgrep “cmdname”

这三种在bash和busybox ash里面的运行结果稍有不同

  • 第一种完全相同,但是因为调用命令次数较多,性能上是不行的。
  • 第二种: pidof 只能获取程序的文件名匹配到的进程号,在ash中 比如 pidof “usr/bin/telnetd” 和 pidof “telnetd”中结果不一样, 前一种结果为空,但是在bash中执行两者一样。
  • 第三种: pgrep跟1的效果相同,因为是单一命令,比第一种性能要好得多。
进程杀死

kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。比如在top命令中,我们看到系统运行许多进程,有时就需要使用kill中止某些进程来提高系统资源。在讲解安装和登陆命令时,曾提到系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时,可以切换到其它虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。

  • HUP 1 控制中的终端/程序中断 INT 2 键盘的插入指令(同 Ctrl + C) QUIT 3 键盘的中断指令(同 Ctrl + ) TERM 15 程序的终止指令 KILL 9 程序的强制终止指令(暴力砍掉) CONT 18 程序的再启动指令(STOP(19) 后再重新启动) STOP 19 程序的停止指令(同 Ctrl + Z)

  • 作用:kill命令用来中止一个进程。

  • 格式:kill [ -s signal | -p ] [ -a ] pid … kill -l [ signal ]

  • 参数:

    -s:指定发送的信号。 -p:模拟发送信号。 -l:指定信号的名称列表。 pid:要中止进程的ID号。 Signal:表示信号。

  • 应用

    • 强行中止(经常使用杀掉)一个进程标识号为10400的进程: #kill -9 10400

      img

    • 解除Linux系统的死锁

      在Linux中有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。此时一般不用重新启动计算机,只需要中止(或者说是关闭)这个有问题的程序即可。当kill处于X-Window界面时,主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端,在那里中止有问题的程序。比如,如果Mozilla浏览器程序出现了锁死的情况,可以使用kill命令来中止所有包含有Mozolla浏览器的程序。首先用top命令查处该程序的 PID,然后使用kill命令停止这个程序: #kill -SIGKILL XXX 其中,XXX是包含有Mozolla浏览器的程序的进程标识号。

    • 使用命令回收内存

      我们知道内存对于系统是非常重要的,回收内存可以提高系统资源。kill命令可以及时地中止一些“越轨”的程序或很长时间没有相应的程序。例如,使用top命令发现一个无用 (Zombie) 的进程,此时可以使用下面命令: #kill -9 XXX 其中,XXX是无用的进程标识号。

      然后使用下面命令: #free 此时会发现可用内存容量增加了。

    • killall命令

      Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:

      # killall -HUP inetd

      杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志。

      首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令:

      # kill -pid

      注:标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。