使用rpm和yum安装完后,保留在磁盘上的那叫程序。当使用命令启动程序时,他运行在内存中就叫进程。
查看进程
ps:查看进程。这里看到的只有当前环境的进程,还有其他环境和后台进程并没有显示。结果第一行是标题:
PID:是进程id,由系统分配,非常重要。有些命令必要通过这个id找到这个进程,才能进行下一步操作。
TTY:进程的执行终端,下面会讲。
TIME:该进程总共占用cpu的时间,如果该进程运行时什么事也没做,没有占用cpu,也就不算时间。
CMD:进程启动命令。
bash:在登录putty时,默认会执行一个bash命令,开启bash程序,即命令行,可以在此输入各种命令,这个bash本生就是一个进程。
ps:这就是我执行的ps命令,它会开启一个进程来执行命令,执行完后,这个进程马上就会结束。
当我再次执行ps命令时,ps的PID变成了下图的1358,这又是一个新的进程,而上图中的那个1356进程已经在一瞬间结束了。而bash的PID始终是1339,因为我们并没有关闭命令行,所以这个进程一直存在。执行exit命令可以退出当前bash。
终端与虚拟终端
终端:在早期计算机价格昂贵的年代,一台主机可以有多台终端机,供多人同时使用。每台终端机只需要有输入输出设备,如键盘和显示器。输入命令发送到主机执行,返回结果到显示器显示。虚拟终端:在人手一台主机的年代,可以在主机上运行软件来模拟终端,比如putty,这样的终端称为虚拟终端。
ps -e|grep bash:-e是查看所有进程,包含后台进程,并且用grep过滤只查看bash,看看现在有多少人登录到了bash。
使用了grep就不会显示标题了,现在看第二列即TTY列。
tty1:终端1,在虚拟机中输入用户名密码登录,就打开了终端1。在虚拟机中按ctrl+alt+F2,会切换到终端2,即tty2。默认有六个,F1-F6。
pts/3:虚拟终端/3,从前面的图可以看出我现在正在pts/3,即第四个虚拟终端上操作。我现在只开了这一个putty,那么0-2是又是什么?然道是黑客?并不是。。而是我之前开过的三个putty,由于非正常关闭的原因,导致它们现在仍然存在,成了僵尸程序。重启服务器可以结束它们,但是线上服务器怎么可能随意重启?
kill结束进程
父进程、子进程、fork
ps -f:-f是显示更多完整的信息。现在多了几列,这里只讨论PPID:即parent PID父进程。ps的父进程1437正是bash的PID。
在bash中执行ps命令时,bash即父进程会复制一个子进程,并继承父进程的环境,最终由子进程来执行ps。这种复制方式就是fork,在以后讲服务的时候需要配置fork,并理解父子进程,所以这里提前说一下。
那么bash的父进程1433又是什么?它不属于当前终端的进程,仅ps命令查不到,如果要查看所有进程,可以使用-e选项。
ps -ef|grep 1433:在所有进程中查找1433,并且使用-f格式。
注意:这是最常用的搜索进程命令,比如要查找tomcat进程是否启动成功,是否正在运行,可以执行ps -ef|grep tomcat。
结果第一行就是1433,它的终端是?,这是因为在服务器启动时,会自动开启一些后台服务,这些进程是与终端无关的。而sshd: root@pts/3又是什么?如果继续往上找994,会发现994是sshd进程,就是ssh的守护进程,即开机自启的ssh服务,下篇会讲。那么sshd: root@pts/3就是ssdh的子进程,也就是每开一个putty终端,sshd都会开一个对应的子进程。然后通过ssdh的子进程来打开我们putty中的bash。所以上面在执行kill -15 1076结束pts/0的bash的时候,由于其绑定的父进程sshd: root@pts/0一直存在,所以这样正常结束子进程是无效的。
现在我们用kill -15 1433结束当前bash的父进程sshd: root@pts/3,如下图,putty被断掉。因为子进程bash也被一起杀掉了,这就是有效的。你再重新开一个putty去搜索子进程的PID是搜不到的。
注意:
1.有的进程并没有与其绑定的父进程,那就可以直接正常结束了。比如你装个tomcat运行,会发现他的PPID是1,这种顶级数字的进程显然不是。
2.kill -15杀不掉还会有其他原因,比如程序文件等已经被破坏,这就不是父进程的问题了。