仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 425|回复: 8
打印 上一主题 下一主题

[CentOS(社区)] 来一发kill 、killall、pkill、xkill pgrep ps 下令注释

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 21:18:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
欢迎大家来到仓酷云论坛!停止一个历程或停止一个正在运转的步伐,通常为经由过程kill、killall、pkill、xkill等举行。好比一个步伐已逝世失落,但又不克不及加入,这时候就应当思索使用这些工具。

别的使用的场所就是在办事器办理中,在不触及数据库办事器步伐的父历程的中断运转,也能够用这些工具来停止。为何数据库办事器的父历程不克不及用这些工具杀逝世呢?缘故原由很复杂,这些工具在强行停止数据库办事器时,会让数据库发生更多的文件碎片,当碎片到达必定水平的时分,数据库就有溃散的伤害。好比mysql办事器最好是按其一般的步伐封闭,而不是用pkillmysqld或killallmysqld如许伤害的举措;固然关于占用资本过量的数据库子历程,我们应当用kill来杀失落。

1kill

kill的使用是和ps或pgrep下令分离在一同利用的;

kill的用法:

kill[旌旗灯号代码]历程ID

注:旌旗灯号代码能够省略;我们经常使用的旌旗灯号代码是-9,暗示强迫停止;

举例:

[root@localhost~]#psauxf|grephttpd
root49390.00.05160708pts/3S+13:100:00\_grephttpd
root48300.11.32423210272?Ss13:020:00/usr/sbin/httpd
apache48330.00.6243644932?S13:020:00\_/usr/sbin/httpd
apache48340.00.6243644928?S13:020:00\_/usr/sbin/httpd
apache48350.00.6243644928?S13:020:00\_/usr/sbin/httpd
apache48360.00.6243644928?S13:020:00\_/usr/sbin/httpd
apache48370.00.6243644928?S13:020:00\_/usr/sbin/httpd
apache48380.00.6243644928?S13:020:00\_/usr/sbin/httpd
apache48390.00.6243644928?S13:020:00\_/usr/sbin/httpd
apache48400.00.6243644928?S13:020:00\_/usr/sbin/httpd

我们检察httpd办事器的历程;您也能够用pgrep-lhttpd来检察;

我们看下面例子中的第二列,就是历程PID的列,个中4830是httpd办事器的父历程,从4833-4840的历程都是它4830的子历程;假如我们杀失落父历程4830的话,其下的子历程也会随着逝世失落;

[root@localhost~]#kill4840注:杀失落4840这个历程;
[root@localhost~]#ps-auxf|grephttpd注:检察一下会有甚么了局?是否是httpd办事器仍在运转?
[root@localhost~]#kill4830注:杀失落httpd的父历程;
[root@localhost~]#ps-aux|grephttpd注:检察httpd的别的子历程是不是存在,httpd办事器是不是仍在运转?

关于僵尸历程,能够用kill-9来强迫停止加入;

好比一个步伐已完全逝世失落,假如kill不加旌旗灯号强度是没有举措加入,最好的举措就是加旌旗灯号强度-9,前面要接杀父历程;好比;

[root@localhost~]#psaux|grepgaim
beinan50319.02.310499617484?S13:230:01gaim
root50360.00.05160724pts/3S+13:240:00grepgaim

[root@localhost~]#pgrep-lgaim
5031gaim
[root@localhost~]#kill-95031


2killall

killall经由过程步伐的名字,间接杀逝世一切历程,我们复杂说一下就好了。

用法:killall正在运转的步伐名

killall也和ps或pgrep分离利用,对照便利;经由过程ps或pgrep来检察哪些步伐在运转;

举例:

[root@localhostbeinan]#pgrep-lgaim
2979gaim
[root@localhostbeinan]#killallgaim


3pkill

pkill和killall使用***差未几,也是间接杀逝世运转中的步伐;假如您想杀失落单个历程,请用kill来杀失落。

使用***:

#pkill正在运转的步伐名

举例:

[root@localhostbeinan]#pgrep-lgaim
2979gaim
[root@localhostbeinan]#pkillgaim


4xkill

xkill是在桌面用的杀逝世图形界面的步伐。好比当firefox呈现溃散不克不及加入时,点鼠标就可以杀逝世firefox。当xkill运转时出来和团体脑骨的图标,哪一个图形步伐溃散一点就OK了。假如您想停止xkill,就按右键作废;

xkill挪用***:

[root@localhost~]#xkill

**************************************
pgrep
pgrep是经由过程步伐的名字来查询历程的工具,通常为用来判别步伐是不是正在运转。在办事器的设置和办理中,这个工具常被使用,复杂了然;
用法:
#ps参数选项步伐名
经常使用参数
-l列出步伐名和历程ID;
-o历程肇端的ID;




ps
之前就约莫懂得一点僵尸历程的观点,明天再好好地经由过程网上资本并实践写C步伐实行了,如今对僵尸历程总结一下。
1.僵尸历程观点:

僵尸历程(ZombieProcess):就是已停止了的历程,可是没有从历程表中删除。太多了会招致历程内外面条目满了,进而招致体系溃散,却是不占用其他体系资本。
Linux历程的形态中,僵尸历程长短常特别的一种,它已保持了几近一切内存空间,没有任何可实行代码,也不克不及被调剂,仅仅在历程列表中保存一个地位,纪录该历程的加入形态等信息供其他历程搜集,除此以外,僵尸历程不再占据任何内存空间。它必要它的父历程来为它收尸,假如他的父历程没安装SIGCHLD旌旗灯号处置函数挪用wait或waitpid()守候子历程停止,又没有显式疏忽该旌旗灯号,那末它就一向坚持僵尸形态,假如这时候父历程停止了,那末init历程主动会接办这个子历程,为它收尸,它仍是能被扫除的。可是假如假如父历程是一个轮回,不会停止,那末子历程就会一向坚持僵尸形态,这就是为何体系中偶然会有良多的僵尸历程。

2.僵尸历程发生的缘故原由:
每一个Linux历程在历程内外都有一个进进点(entry),中心步伐实行该历程时利用到的统统信息都存储在进进点。当用ps下令观察体系中的历程信息时,看到的就是历程表中的相干数据。当以fork()体系挪用创建一个新的历程后,中心历程就会在历程表中给这个新历程分派一个进进点,然后将相干信息存储在该进进点所对应的历程表内。这些信息中有一项是其父历程的辨认码。当这个历程走完了本人的性命周期后,它会实行exit()体系挪用,此时本来历程表中的数据会被该历程的加入码(exitcode)、实行时所用的CPU工夫等数据所代替,这些数据会一向保存到体系将它传送给它的父历程为止。因而可知,defunct历程的呈现工夫是在子历程停止后,可是父历程还没有读取这些数据之前。

3.僵尸历程的检察:
用top下令,能够看到
Tasks:123total,1running,122sleeping,0stopped,0zombie
zombie后面的数目就是僵尸历程到数目;
ps-ef
呈现:
root1302812956010:51pts/200:00:00[ls]<defunct>
最初有defunct的标志,就标明是僵尸历程。

4.僵尸历程办理举措:
4.1改写父历程,在子历程身后要为它收尸。详细做法是接受SIGCHLD旌旗灯号。子历程身后,会发送SIGCHLD旌旗灯号给父历程,父历程收到此旌旗灯号后,实行waitpid()函数为子历程收尸。这是基于如许的道理:就算父历程没有挪用wait,内核也会向它发送SIGCHLD动静,只管对的默许处置是疏忽,假如想呼应这个动静,能够设置一个处置函数。
4.2把父历程杀失落。父历程身后,僵尸历程成为"孤儿历程",过继给1号历程init,init一直会卖力清算僵尸历程.它发生的一切僵尸历程也随着消散。
kill-9`ps-ef|grep"ProcessName"|awk{print$3}`
个中,“ProcessName”为处于zombie形态的历程名。
4.3杀父历程不可的话,就实验用skill-tTTY封闭响应终端,TTY是历程响应的tty号(终端号)。可是,ps大概会查不到特定历程的tty号,这时候就必要本人判别了。
4.4其实不可,重启体系吧,这也是最经常使用到***之一。

5.僵尸历程实例:
/*-----zombie1.c-----*/
#include"sys/types.h"
#include"sys/wait.h"
#include"stdio.h"
#include"unistd.h"

intmain(intargc,char*argv[])
{
while(1)
{
pid_tchi=fork();
if(chi==0)
{
execl("/bin/bash","bash","-c","ls",NULL);
}
sleep(2);
}
}
会一直地发生僵逝世历程ls;

/*-----zombie2.c-----*/
#include<stdio.h>
#include<sys/types.h>

main()
{
if(!fork())
{
printf("childpid=%d
",getpid());
exit(0);
}
/*wait();*/
/*waitpid(-1,NULL,0);*/
sleep(60);
printf("parentpid=%d
",getpid());
exit(0);
}
60s内会不休发生僵尸历程,直到父历程exit(0);
假如在挪用wait/waitpid来为子历程收尸,就不会发生僵尸历程了。

PS:运转例子,先gcczombie1.c-ozombie编译,然后运转zombie;
然后能够可用ps-ef来检察是不是发生了僵尸历程。
其他常识:
execl:M程M进了shellh境绦绦型赀M程Y束
system=fork+exec+waitpid:绦型赀M程仍旧存在,只是用它的子M程绦辛瞬僮鳌



ps的参数申明
ps供应了良多的选项参数,经常使用的有以下几个:

l长格局输入;
u按用户名和启动工夫的按次来显现历程;
j用义务格局来显现历程;
f用树形格局来显现历程;

a显现一切用户的一切历程(包含别的用户);
x显现无把持终真个历程;
r显现运转中的历程;
ww制止具体参数被截断;

我们经常使用的选项是组合是aux或lax,另有参数f的使用。
psaux
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
root35320.00.22428452?Ss20:400:00gpm-m/dev/input/mice-timps2
htt35640.01.7294603704?Sl20:410:00htt_server-nodaemon
root35740.00.45236992?Ss20:410:00crond
root36270.00.23448552?SNs20:410:00anacron-s
root36360.00.12304420?Ss20:410:00/usr/sbin/atd
ubuntu236550.00.5138401084?Ssl20:410:00dbus-daemon-1--system
Stat形态注释:
X逝世失落的历程
<高优先级
N低优先级
L有些页被锁进内存
s包括子历程
+位于背景的历程组;

l多线程,克隆线程multi-threaded(usingCLONE_THREAD,likeNPTLpthreadsdo)
WCHAN正在守候的历程资本;

------------------------------------------------------------------------------------------
au(x)输入格局:

USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
USER:路程具有者
PID:pid
%CPU:占用的CPU利用率
%MEM:占用的影象体利用率
VSZ:占用的假造影象体巨细
RSS:占用的影象体巨细
TTY:终真个主要安装号码(minordevicenumberoftty
)
STAT:该路程的形态:
D:不成中止的运动
R:正在实行中
S:运动形态
T:停息实行
Z:不存在但临时没法打消
W:没有充足的影象体分页可分派
<:高优先序的路程
N:低优先序的路程
L:有影象体分页分派并锁在影象体内
START:路程入手下手工夫
TIME:实行的工夫
COMMAND:所实行的指令








------------------------------------------------------------------------------------------
D不成中止uninterruptiblesleep(usuallyIO)
R运转runnable(onrunqueue)
S中止sleeping
T中断tracedorstopped
Z僵逝世adefunct(”zombie”)process
在Unix体系办理中,当用ps下令察看历程的实行形态时,常常看到某些历程的形态栏为defunct,这就是所谓的“僵尸”历程。“僵尸”历程是一个早已出生的历程,但在历程表(processstable)中仍占了一个地位(slot)。因为历程表的容量是无限的,以是,defunct历程不但占用体系的内存资本,影响体系的功能,并且假如其数目太多,还会招致体系瘫痪。可是当父历程身后,僵尸历程成为"孤儿历程",过继给1号历程init,init一直会卖力清算僵尸历程.它发生的一切僵尸历程也随着消散。

1、界说:甚么是孤儿历程和僵尸历程
僵尸历程:一个子历程在其父历程还没有挪用wait()或waitpid()的情形下加入。这个子历程就是僵尸历程。
孤儿历程:一个父历程加入,而它的一个或多个子历程还在运转,那末那些子历程将成为孤儿历程。孤儿历程将被init历程(历程号为1)所收养,并由init历程对它们完成形态搜集事情。
僵尸历程将会招致资本华侈,而孤儿则不会。



子历程延续10秒钟的僵尸形态(EXIT_ZOMBIE)
------------------------------------------------------
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

main()
{
pid_tpid;
pid=fork();
if(pid<0)
printf("erroroccurred!
");
elseif(pid==0){
printf("Hifather!ImaZOMBIE
");
exit(0);//(1)
}
else{
sleep(10);
wait(NULL);//(2)
}
}

(1)向父历程发送SIGCHILD旌旗灯号
(2)父历程处置SIGCHILD旌旗灯号

实行exit()时依据其父历程的形态决意本人的形态:
假如父历程已加入(没有wait),则该子历程将会成为孤儿历程过继给init历程
假如其父历程还没有加入,也没有wait(),那末该历程将向父历程发送SIGCHILD旌旗灯号,进进僵尸形态守候父历程为其收尸。假如父历程一向没有实行wait(),那末该子历程将会延续处于僵尸形态。




子历程将成为孤儿历程
------------------------------------------------------
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

main()
{
pid_tpid;
pid=fork();
if(pid<0)
printf("erroroccurred!
");
elseif(pid==0){
sleep(6);
printf("Imaorphan
");
exit(0);
}
else{
sleep(1);
printf("ChildrenBye!
");
}
}

#./a.out
ChildrenBye!
#Imaorphan
(回车后将会进进#)
#
2、有甚么坏处:
僵尸历程会占用体系资本,假如良多,则会严峻影响办事器的功能
孤儿历程不会占用体系资本
处置流程:
只需老爹不等wait(sys/wait.h)儿子,儿子都将成为孤魂野鬼zombie(zombie),unix中默许老爹老是想看儿子身后的形态(以便报仇)
if老爹比儿子先再会
儿子将被init(id=1)收养,最初的了局是zombie儿子完全再会,体系资本开释
else
{
儿子的zombie将一向存在,体系资本占用...
if老爹dead
儿子将被init(id=1)收养,最初的了局是zombie儿子完全再会,体系资本开释

else相似的儿子zombie愈来愈多,体系就等逝世了!!!
}
3、怎样避免僵尸历程
起首分明怎样发生僵尸历程:
1、子历程停止后向父历程收回SIGCHLD旌旗灯号,父历程默许疏忽了它
2、父历程没有挪用wait()或waitpid()函数来守候子历程的停止
第一种***:捕获SIGCHLD旌旗灯号,并在旌旗灯号处置函数内里挪用wait函数
转贴RichardSteven的UnixNetworkProgramming代码

int
main(intargc,char**argv)
{
...
Signal(SIGCHLD,sig_chld);
for(;
}
...
}

void
sig_chld(intsigno)
{
pid_tpid;
intstat;

while((pid=waitpid(-1,&stat,WNOHANG))>;0)
printf("child%dterminated
",pid);
return;
}
第二种***:两次fork():转载
在《Unix情况初级编程》里关于这个在8.6节有十分分明的申明。

实例
回想一下8.5节中有关僵逝世历程的会商。假如一个历程要fork一个子历程,但不请求它守候
子历程停止,也不但愿子历程处于僵逝世形态直到父历程停止,完成这一请求的窍门是挪用fork
两次。步伐8-5完成了这一点。
在第二个子历程中挪用sleep以包管在打印父历程ID时第一个子历程已停止。在fork以后,
父、子历程都可持续实行――我们没法预知哪个会先实行。假如不使第二个子历程就寝,则
在fork以后,它大概比其父历程先实行,因而它打印的父历程ID将是创立它的父历程,而不是
init历程(历程ID1)。

#include<sys/types.h>
#include<sys/wait.h>
#include"ourhdr.h"

int
main(void)
{
pid_tpid;

if((pid=fork())<0)
err_sys("forkerror");
elseif(pid==0){/*firstchild*/
if((pid=fork())<0)
err_sys("forkerror");
elseif(pid>0)
exit(0);/*parentfromsecondfork==firstchild*/

/*Werethesecondchild;ourparentbecomesinitassoon
asourrealparentcallsexit()inthestatementabove.
Hereswherewedcontinueexecuting,knowingthatwhen
weredone,initwillreapourstatus.*/

sleep(2);
printf("secondchild,parentpid=%d
",getppid());
exit(0);
}

if(waitpid(pid,NULL,0)!=pid)/*waitforfirstchild*/
err_sys("waitpiderror");

/*Weretheparent(theoriginalprocess);wecontinueexecuting,
knowingthatwerenottheparentofthesecondchild.*/

exit(0);
}
//avoidzombieprocessbyforkingtwice



-----------------------------
orphan.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
intmain()
{
pid_tpid;
pid=fork();
if(!pid){
while(1){
printf("Abackgroundprocess,PID:%d
,ParentID:%d
",getpid(),getppid());
sleep(3);
}
}
elseif(pid>0){
printf("Iamparentprocess,mypidis%d
",getpid());
exit(0);
}
else{
printf("Processcreationfailed!
");
}
return0;
}
步伐运转了局
Iamparentprocess,mypidis2026
Abackgroundprocess,PID:2027
,ParentID:2026
think@Ubuntu:~/work/process_thread/fork2$Abackgroundprocess,PID:2027
,ParentID:1
Abackgroundprocess,PID:2027
,ParentID:1
Abackgroundprocess,PID:2027
,ParentID:1
Abackgroundprocess,PID:2027
,ParentID:1
Abackgroundprocess,PID:2027
,ParentID:1
Abackgroundprocess,PID:2027
,ParentID:1
-----------------------------

----------------------------
Zombie.c
#include
  #include
  main()
  {
  pid_tpid;
  
  pid=fork();
  
  if(pid<0)/*假如堕落*/
  printf("erroroccurred!n");
  elseif(pid==0)/*假如是子历程*/
  exit(0);
  else/*假如是父历程*/
  sleep(60);/*休眠60秒,这段工夫里,父历程甚么也干不了*/
  wait(NULL);/*搜集僵尸历程*/
  }

----------------------------

浅议孤儿历程和僵尸历程(defunc)

http://blog.csdn.net/wzb56/archive/2011/04/16/6328472.aspx
Linux历程进修总结
http://hi.baidu.com/shansharp/blog/item/84b5b4dfb04f1a0b48540351.html








psaux内里的STAT项的Sl+暗示甚么?
年夜写的S和小写的s有甚么分歧,+号暗示甚么?

google发明只要上面的情形,没有申明下面的两个器材.
ps-aux时显现出来的项目都是些甚么意义?好比:RSS、VSZ、STAT等

USER:路程具有者
PID:pid
%CPU:占用的CPU利用率
%MEM:占用的影象体利用率
VSZ:占用的假造影象体巨细
RSS:占用的影象体巨细
TTY:终真个主要安装号码(minordevicenumberoftty)
STAT:该路程的形态:
D:不成中止的运动(通悸□□缜b举行I/O举措)
R:正在实行中
S:运动形态
T:停息实行
Z:不存在但临时没法打消
W:没有充足的影象体分页可分派
<:高优先序的路程
N:低优先序的路程
L:有影象体分页分派并锁在影象体内(及时体系或捱AI/O)
START:路程入手下手工夫
TIME:实行的工夫
COMMAND:所实行的指令

gilet宣布于2009-07-2216:22
stat中的参数意义以下:
D不成中止Uninterruptible(usuallyIO)
R正在运转,或在行列中的历程
S处于休眠形态
T中断或被追踪
Z僵尸历程
W进进内存互换(从内核2.6入手下手有效)
X逝世失落的历程

<高优先级
n低优先级
s包括子历程
+位于背景的历程组


kns1024wh宣布于2009-07-2811:15
PROCESSSTATECODES
Herearethedifferentvaluesthatthes,statandstateoutputspecifiers
(header"STAT"or"S")willdisplaytodescribethestateofaprocess.
DUninterruptiblesleep(usuallyIO)
RRunningorrunnable(onrunqueue)
SInterruptiblesleep(waitingforaneventtocomplete)
TStopped,eitherbyajobcontrolsignalorbecauseitisbeingtraced.
Wpaging(notvalidsincethe2.6.xxkernel)
Xdead(shouldneverbeseen)
ZDefunct("zombie")process,terminatedbutnotreapedbyitsparent.

ForBSDformatsandwhenthestatkeywordisused,additionalcharactersmay
bedisplayed:
<high-priority(notnicetootherusers)
Nlow-priority(nicetootherusers)
Lhaspageslockedintomemory(forreal-timeandcustomIO)
sisasessionleader
lismulti-threaded(usingCLONE_THREAD,likeNPTLpthreadsdo)
+isintheforegroundprocessgroup

如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!
柔情似水 该用户已被删除
沙发
发表于 2015-1-17 10:38:31 | 只看该作者
虽然大家都比较喜欢漂亮的mm,但是在学linux的过程中,还是要多和“男人”接触一下:P遇到问题的时候,出来看说和上网查之外,就是要多用linux下的man命令找找帮助。
莫相离 该用户已被删除
板凳
发表于 2015-1-24 12:05:46 | 只看该作者
未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。
愤怒的大鸟 该用户已被删除
地板
发表于 2015-2-1 13:11:36 | 只看该作者
为什么要学Linux呢?每个人都有不同的看法,下面我说说自己的感想吧。?
山那边是海 该用户已被删除
5#
发表于 2015-2-7 08:34:47 | 只看该作者
应对Linux的发展历史和特点有所了解,Linux是抢占式多任务多用户操作系统,Linux最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具。
再现理想 该用户已被删除
6#
发表于 2015-2-21 19:30:26 | 只看该作者
在学习linux的工程中,linux学习方法有很多种,这里是小编的学习心得,给大家拿出来分享一下。
金色的骷髅 该用户已被删除
7#
发表于 2015-3-6 23:33:01 | 只看该作者
然我们对Linux的学习首先是通过对它的产生,发展,到今天仍然在不断完善开始的。
海妖 该用户已被删除
8#
发表于 2015-3-13 23:46:00 | 只看该作者
当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。
不帅 该用户已被删除
9#
发表于 2015-3-21 00:09:05 | 只看该作者
目前全球有超过一百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,RedhatLinux和DebianLinux是网络管理员的理想选择。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 23:28

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表