linux 学习笔记--kill杀死进程
Centos上进程有5种状态
运行(正在运行或在运行队列中等待)
中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
ps工具标识进程的状态码:
状态码
解释
D
不可中断 uninterruptible sleep (usually IO)
R
运行 runnable (on run queue)
S
中断 sleeping
T
停止 traced or stopped
Z
僵死 a defunct (”zombie”) process
W
没有足够的记忆体分页可分配
<
高优先序的行程
N
低优先序的行程
L
有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O)
kill杀死进程总结
最长使用的结束进程的信号是:
Signal Name
Single Value
Effect
SIGHUP
1
挂起
SIGINT
2
键盘的中断信号
SIGKILL
9
发出杀死信号
SIGTERM
15
发出终止信号
SIGSTOP
17, 19, 23
停止进程
杀死进程最安全的方法是单纯使用kill命令。
基本步骤:
首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令:
# kill -pid
注释:标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。
为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。
*确定要杀死进程的PID或PPID
# ps -ef | grep httpd
*以优雅的方式结束进程
# kill -l PID
-l选项告诉kill命令用好像启动进程的用户已注销的方式结束进程。当使用该选项时,kill命令也试图杀死所留下的子进程。
但这个命令也不是总能成功--或许仍然需要先手工杀死子进程,然后再杀死父进程。
*TERM信号
给父进程发送一个TERM信号,试图杀死它和它的子进程。
# kill -TERM PPID
*killall命令
killall命令杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID。
# killall httpd
*停止和重启进程,如下:
# kill -HUP PID
该命令让Linux温柔的执行进程关闭,然后立即重启。
在配置应用程序的时候,这个命令很方便,在对配置文件修改后需要重启时可以执行此命令(例如重启nginx经常用到这个命令)。
*必杀技
kill -9 PID
当使用此命令时,一定要通过ps -ef确认没有剩下任何僵尸进程。只能通过终止父进程来消除僵尸进程。如果僵尸进程被init收养,问题就比较严重了。杀死init进程意味着关闭系统。
如果系统中有僵尸进程,并且其父进程是init,而且僵尸进程占用了大量的系统资源,那么就需要在某个时候重启机器以清除进程表了。