linux 僵尸进程

来源:互联网 发布:steam mac 中文游戏 编辑:程序博客网 时间:2024/06/13 23:47
  1. 产生背景
    买的云主机,装的docker,docker启动一段时间后,同事反映不能写入了,结果发现,根路径100% ,新手原因,他启动的时候没有映射本地路径,docker默认存储位置是/var/lib/docker 下,在镜像中写入的时候导致根目录沾满,于是让他听掉对应的进程,发现已经停不了了,无赖之下直接停止了docker 服务,发现有个镜像文件已无法识别。
    再次启动systemctl start docker 无法启动 ,通过journalctl -u docker.service 查看发现 是存储盘已满的原因,还以为停止会释放部分空间,再次启动通过docker 命令删除对应的image ,发现行不通

2.解决

备份/var/lib/docker,到存储盘下 建立软连指向/var/lib/docker
并启动服务,后发现显示正常,之前的images 也可以正常启动

ln -s /data/docker-volume  /var/lib/dockersystemctl start dockerdocker ps

接下来是不是可以删除之前的备份文件了

rm -rf  /var/lib/docker

报错 device or resource busy
是不是有进程在写
lsof 没命令 擦
安装:空间不足。擦擦(删除一部分日志 和无用的东西再次安装)
发现文件 mount

mount/dev/dm-1 /var/lib/docker/image/devicemapper/layerdb/mounts/f83573b2a54b9a9ba190639d29b99edde878d7ed12320e5d542f57d3e5caded0  umountumount -v /dev/dm-1

发现还是无法删除
mount发现
/var/lib/docker整路径被挂载了
继续umount

问题来了 文件不见 空间没释放

df -h/dev/vda1        20G   20G  20k  100% /
lsof |grep deleted dockerd    9639 10884    root   11uW     REG              253,1     32768   34680840 /var/lib/docker.bak/volumes/metadata.db (deleted)dockerd    9639 10884    root   18uW     REG              253,1     16384     190524 /var/lib/docker.bak/builder/fscache.db (deleted)

备份的文件还在删除中,一般做法 kill 点对于进程就可以了,空间得等释放

 kill -9 9639 ps -ef |grep dockerd root     12440  9831  0 14:31 pts/3    00:00:00 grep --color=auto dockerd

what??? 开始怀疑了

ps -auxH |grep dockerd root      9639  0.0  0.0      0     0 ?        Zsl  Nov27   2:06 [dockerd] <defunct>root      9639  0.0  0.2 1390188 43768 ?       Dsl  Nov27   2:07 [dockerd] <defunct>root     12442  0.0  0.0 112668   976 pts/3    S+   14:32   0:00 grep --color=auto dockerd

Zsl 是神马? 查看ps 命令可以看出 僵死,子进程,多线,这玩意儿试僵尸进程

USER    用户名UID    用户ID(User ID)PID    进程ID(Process ID)PPID    父进程的进程ID(Parent Process id)SID    会话ID(Session id)%CPU    进程的cpu占用率%MEM    进程的内存占用率VSZ    进程所使用的虚存的大小(Virtual Size)RSS    进程使用的驻留集大小或者是实际内存的大小,Kbytes字节。TTY    与进程关联的终端(tty)STAT    进程的状态:进程状态使用字符表示的(STAT的状态码)R 运行    Runnable (on run queue)            正在运行或在运行队列中等待。S 睡眠    Sleeping                休眠中, 受阻, 在等待某个条件的形成或接受到信号。I 空闲    IdleZ 僵死    Zombie(a defunct process)        进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。D 不可中断    Uninterruptible sleep (ususally IO)    收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。T 终止    Terminate                进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。P 等待交换页W 无驻留页    has no resident pages        没有足够的记忆体分页可分配。X 死掉的进程< 高优先级进程                    高优先序的进程N 低优先    级进程                    低优先序的进程L 内存锁页    Lock                有记忆体分页分配并缩在记忆体内s 进程的领导者(在它之下有子进程);l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)+ 位于后台的进程组 START    进程启动时间和日期TIME    进程使用的总cpu时间COMMAND    正在执行的命令行命令NI    优先级(Nice)PRI    进程优先级编号(Priority)WCHAN    进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。FLAGS    与进程相关的数字标识

什么是僵尸进程:
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。可以通过top 或者ps命令都可以进行查看

如何查杀呢:
主要是找到对应的父进程 杀死他,父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'或者ps -e -o ppid,stat | grep Z | cut -d "" -f2

可以使用:

ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'| xargs kill -9或者kill -HUP `ps -A -ostat,ppid | grep -e '^[Zz]' | awk '{print $2}'`或者直接杀死ps -ef | grep docker | grep -v grep | awk '{print "kill -18 " $3}'

-A 参数列出所有进程
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
HUP(1)是让进程挂起,睡眠;
kill (9)六亲不认的杀掉

可我的运气比较背
父进程是1 init 进程,怎么办呢

最好重启了。。。。

linux signals

Signal Name Number Description
SIGHUP 1 Hangup (POSIX)
SIGINT 2 Terminal interrupt (ANSI)
SIGQUIT 3 Terminal quit (POSIX)
SIGILL 4 Illegal instruction (ANSI)
SIGTRAP 5 Trace trap (POSIX)
SIGIOT 6 IOT Trap (4.2 BSD)
SIGBUS 7 BUS error (4.2 BSD)
SIGFPE 8 Floating point exception (ANSI)
SIGKILL 9 Kill(can’t be caught or ignored) (POSIX)
SIGUSR1 10 User defined signal 1 (POSIX)
SIGSEGV 11 Invalid memory segment access (ANSI)
SIGUSR2 12 User defined signal 2 (POSIX)
SIGPIPE 13 Write on a pipe with no reader, Broken pipe (POSIX)
SIGALRM 14 Alarm clock (POSIX)
SIGTERM 15 Termination (ANSI)
SIGSTKFLT 16 Stack fault
SIGCHLD 17 Child process has stopped or exited, changed (POSIX)
SIGCONT 18 Continue executing, if stopped (POSIX)
SIGSTOP 19 Stop executing(can’t be caught or ignored) (POSIX)
SIGTSTP 20 Terminal stop signal (POSIX)
SIGTTIN 21 Background process trying to read, from TTY (POSIX)
SIGTTOU 22 Background process trying to write, to TTY (POSIX)
SIGURG 23 Urgent condition on socket (4.2 BSD)
SIGXCPU 24 CPU limit exceeded (4.2 BSD)
SIGXFSZ 25 File size limit exceeded (4.2 BSD)
SIGVTALRM 26 Virtual alarm clock (4.2 BSD)
SIGPROF 27 Profiling alarm clock (4.2 BSD)
SIGWINCH 28 Window size change (4.3 BSD, Sun)
SIGIO 29 I/O now possible (4.2 BSD)
SIGPWR 30 Power failure restart (System V)

原创粉丝点击