1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab)。
2. ps 命令用于查看当前正在运行的进程。
grep 是搜索
例如: ps -ef | grep java
表示查看所有进程里 CMD 是 java 的进程信息
ps -aux | grep java
-aux 显示所有状态
ps
3. kill 命令用于终止进程
例如: kill -9 [PID]
-9 表示强迫进程立即停止
通常用 ps 查看进程 PID ,用 kill 命令终止进程
网上关于这两块的内容
4.批量删除进程
介绍两种方法。要kill的进程都有共同的字串。
代码如下 | 复制代码 |
[plain] kill -9 `ps -ef |grep xxx|awk '{print $2}' ` |
kill -9后面的符号是Tab键上方那个。
如上就是kill -9 `列出进程,找到包含xxx的行,输出pid的列`
kill、ps、grep都是很常用的命令了。
awk的作用是输出某一列,{print $2}就是输出第二列,如上即是pid这一列。这里有一篇awk的教程
代码如下 | 复制代码 |
[plain] ps -ef | grep xxx | grep -v root | awk '{print $2}' | xargs kill -9 |
grep -v这个参数的作用是排除某个字符。所以这里排除了root执行的命令。
之后也利用awk找到pid这一列。
最后的xargs是从标准输出获取参数并执行命令的程序,即从前面的命令获取输出作为参数来执行下一个命令。
5.清理僵尸进程
例
今天在维护服务器的时候,发现有5个nova-novncproxy的僵尸进程。
?
26327 ? S 0:05 _ /usr/bin/python /usr/bin/nova-novncproxy --config-file=/etc/nova/nova.conf
4765 ? Z 0:00 _ [nova-novncproxy] <defunct>
4766 ? Z 0:00 _ [nova-novncproxy] <defunct>
4767 ? Z 0:00 _ [nova-novncproxy] <defunct>
4768 ? Z 0:00 _ [nova-novncproxy] <defunct>
4769 ? Z 0:00 _ [nova-novncproxy] <defunct>
一般僵尸进程很难直接kill掉,不过您可以kill僵尸爸爸。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
代码如下 | 复制代码 |
ps -e -o ppid,stat | grep Z | cut -d” ” -f2 | xargs kill -9 或 kill -HUP `ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’` |
当然您可以自己编写更好的shell脚本,欢迎与大家分享。
我将nova-novncproxy stop后再start,僵尸进程即消失,问题解决。
另外子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。就是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,而此时,尽管对它的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
6.如何避免僵尸进程呢?
处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下 可以简单地将 SIGCHLD信号的操作设为SIG_IGN。
signal(SIGCHLD,SIG_IGN);
这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程
或者
用两次fork(),而且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程。