linux进程相关内容

117 阅读2分钟

前言

  • 模拟僵尸进程
  • 模拟孤儿进程
  • 如何正确回收子进程,没有正确回收会有哪些问题
  • 先杀掉父进程,子进程会咋样: 会被init接管
  • 先杀子进程,父进程会如何?关键在于父进程有没有正确回收,如果没有回收会有僵尸进程
  • kill 信号的不同效果

模拟僵尸进程

  • 僵尸进程的定义: 子进程退出之后,父进程没有正常回收
  • 模拟僵尸进程: 让子进程先退出,

验证代码

#!/usr/bin/python

import os,sys,time

pid = os.fork()
getpid = os.getpid()
getppid = os.getppid()

if pid == 0:
    print("this is child pid=%d,getpid=%d,getppid=%d" %(pid,os.getpid(),os.getppid()))
    time.sleep(10)
    print("this is child pid=%d,getpid=%d,getppid=%d" % (pid, os.getpid(), os.getppid()))
else:
    print("This is parent pid=%d,getpid=%d,getppid=%d"%(pid,getpid,getppid))
    ##或者os.wait(), 使用os.WNOHANG要注意,它是非阻塞命令,需要确定在子进程
    ##退出之后再调用,或者使用信号处理函数
    os.waitpid(-1, os.WUNTRACED)##移除后父进程就无法回收子进程,导致变成僵死进程
    time.sleep(20)

僵尸进程的处理

  • 方法1: SIGCHLD信号: 子进程结束后,会向父进程发送此信号,signal(SIGCHLD, SIG_IGN); 父进程忽略SIGCHILD信号后,init进程将进行接管
  • 方法2: 父进程回收: os.waitpid
  • 方法3: kill调僵尸进程的父进程,父进程死后,僵尸进程会成为孤儿进程,init将进行接管处理

僵尸进程的危害

僵尸进程会占用系统资源,如果很多,则会严重影响服务器的性能; 孤儿进程不会占用系统资源,最终是由init进程托管,由init进程来释放;

如何杀死某个会话下面的所有子进程

有些系统没有会话 ID 的概念。即使是具有会话 ID 的系统,例如 Linux,也没有提供系统调用来终止会话中的所有进程。你需要遍历 /proc 输出的进程树,收集所有的 SID,然后一一终止进程

常用命令

  • 查看其父进程信息 pstree -asp 57465
  • 查看进程的状态(僵尸,running等状态) ps -aux | grep pid 34141672470602_.pic.jpg

参考资料