记一次 zsh 产生僵尸进程解决

Fri 21 March 2014

问题描述

今天使用 vmplayer 运行了 xp 系统, 关闭后在 zsh 里继续敲命令就阻塞了, 然后就关闭了终端重新打开, 还是阻塞, 重复几次依然如此. 然后使用 gVim 将 shell 切换到 bash, 终端可以正常打开, 然后运行

$ ps aux | grep zsh
wh       27552  0.0  0.1  47244  5164 ?        Ss   09:38   0:00 zsh
wh       27553  0.0  0.1  47244  5156 ?        Ss   09:38   0:00 zsh
wh       27600  0.0  0.0  47348  3492 ?        D    09:38   0:00 zsh
wh       27609  0.0  0.0  47348  3488 ?        D    09:38   0:00 zsh
wh       27614  0.0  0.0  47348  3484 ?        D    09:38   0:00 zsh
wh       27697  0.0  0.1  47248  5172 ?        Ss   09:39   0:00 -/bin/zsh
wh       27718  0.0  0.0  47356  3496 ?        D    09:39   0:00 -/bin/zsh
root     28040  0.0  0.0  36640  2812 tty2     Ss+  09:40   0:00 -zsh
wh       28628  0.0  0.0  47356  3492 ?        D    09:42   0:00 -/bin/zsh

发现好多僵尸进程, 而且都 kill 不掉. 发现好多 D 状态的进程, 查看 ps 的手册, D 状态的解释是

D    uninterruptible sleep (usually io)

进程可能是由 I/O 引起的不可间断的等待.

解决

首先当然是 strace 登场

$ strace zsh
...
pipe([3, 4])                            = 0
fcntl(3, F_DUPFD, 10)                   = 11
close(3)                                = 0
fcntl(4, F_DUPFD, 10)                   = 12
close(4)                                = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD WINCH], 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd94caef9d0) = 8750
close(12)                               = 0
fcntl(11, F_GETFL)                      = 0 (flags O_RDONLY)
fstat(11, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd94caf3000
lseek(11, 0, SEEK_CUR)                  = -1 ESPIPE (Illegal seek)
read(11,

从上面可以看出, zsh 打开了一个 pipe, 但是读取的时候阻塞了.

现在调用 strace -f 查看管道另一头的在做些什么

$ strace -f zsh
[pid 28429] chdir("..")                 = 0
[pid 28429] stat("..", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 28429] openat(AT_FDCWD, "..", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
[pid 28429] getdents(3, /* 12 entries */, 32768) = 344
[pid 28429] lstat("../home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 28429] close(3)                    = 0
[pid 28429] chdir("..")                 = 0
[pid 28429] stat("..", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 28429] openat(AT_FDCWD, "..", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
[pid 28429] getdents(3, /* 26 entries */, 32768) = 672
[pid 28429] lstat("../lib", {st_mode=S_IFLNK|0777, st_size=7, ...}) = 0
[pid 28429] lstat("../mnt",

上面可以看到 zsh 在 lstat("../mnt") 的时候产生了等待

/mnt 一般挂载一些东西, 运行 df -h 查看一下, 发现也很慢, 当然 strace 下 它

$ strace df -h
...
stat("/mnt",

发现它同样卡在了读取 /mnt. 尝试 umount 它:

$ sudo umount /mnt
umount: /mnt: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)

说是被某个程序使用, 现在该 lsof 登场了

$ lsof /mnt
lsof /mnt
lsof: WARNING: can't stat() cifs file system /mnt
      Output information may be incomplete.
lsof: status error on /mnt: Host is down

好吧, 看到这里我就想明白了, 因为开虚拟机的时候我挂载了虚拟机里的一个共享目录

$ sudo mount -t cifs -o guest //ip.of.host/share /mnt

在虚拟机关闭之后没有卸载, 导致在对这个目录 stat 的时候会有一个网络超时时间.

然后就卸载它

$ umount -a -t cifs -l /mnt

结果

现在打开 zsh 也不阻塞了, df -h 也同样不阻塞了. 上面 Ss 的进程可以用 -9 杀掉, 但是 D 状态进程无法杀掉.

参考

更新

经过 依云eleven 的指正对文章做了一些修改, 感谢两位.

Category: Linux Tagged: zsh 进程 阻塞 命令 D 僵尸

comments


解决一直崩溃的 Adobe Flash Player

Wed 12 March 2014

1月份的时候决定从 Ubuntu 换到 Archlinux, 换完之后 Flash Player 就一直没正常过. 一打开视屏就 crash. 从那之后就一直用手机看视屏, 很别扭, 放着大屏不用一直盯着手机看看. 今天下定决心找找原因. google 了一阵也没有啥结果, 所以我决定卸载现有的, 手动安装一个试试.

$ sudo pacman -R flashplugin

结果卸载的时候输出段信息:

warning: /etc/adobe/mms.cfg saved as /etc/adobe/mms.cfg.pacsave

然后我看了下文件内容

$ cat /etc/adobe/mms.cfg.pacsave
#Hardware video decoding
EnableLinuxHWVideoDecode=1

瞬间觉得可能是这个选项引起的, 所以我又装上了 flashplugin …

Category: Linux Tagged: archlinux flash player crash 解决

comments

Read More

grep挽救了我一个下午: 恢复rm -f删除的代码

Thu 25 April 2013

今天对代码进行重构, 新添加了一个logics.py模块, 但并没有加入到git库中, 然后对代码进行清理, 有一个logs文件夹是不需要的所以我打算清掉它, 但是zsh将补全定位到logics.py, 手上的动作快过了脑子,直接按了回车, 做完心想完了, 一上午白费了, 还要花一下午的时间来重新写出这个代码, 虽然明知没有希望,但是我还是不想放弃, 于是就google一下有无解决办法,意外的是找到一篇文章:用grep恢复误删的文本

好吧虽然不知道能不能用, 但是我要试试, 因为我不想再花一个下午来重写这个模块, 我在模块里定义了一个Logics类并且上面差不多30行, 往下差不多300行的样子, 我删除logics.py所在的分区是/dev/sda7, 所以我运行了下面命令:

grep -a -B 50 -A 400 "class Logics(object):" /dev/sda7 …

Category: Linux Tagged: Linux grep rm -f 恢复

comments

Read More

Awesome+tmux+gnomeDo打造高效Linux桌面环境

Tue 04 December 2012

引言

近期一直在Linux下工作,使用Ubuntu 11.10,经过一段时间的使用和磨合,终于打造出一套适合自己的高效Linux桌面环境,之前也在博客中零散的写了几篇文章分享,在此做一番总结.

首先先放出桌面截图 Awesome 桌面截图

Awesome

使用Ubuntu 11.10不习惯默认搭载的Unity,Gnome 3也不尽人如意,也使用xfce/openbox,但使用都不是很好,没有Windows的体验好,然后接触了Awesome,Awesome是一款平铺式窗体管理器,Awesome会去除窗口的标题栏等.会使窗口尽量小的占用桌面空间,而且大部分窗口操作都可以通过键盘来进行操作,免除了各位身为键盘高手的码农们频繁拿鼠标的烦恼.

安装

Awesome Ubuntu下安装十分简单:

sudo apt-get install awesome

配置

拷贝配置文件

Awesome 的配置文件使用lua脚本,所以如果你会lua配置起来会得心应手,我们先拷贝一个基础配置文件,然后在这个基础上进行更改:

cp /etc/xdg/awesome/rc.lua ~/.config/awesome #  ~/.confg下如没有awesome则手动创建

配置自动启程序 …

Category: Linux Tagged: 高效 桌面 Tmux Linux gnome do awesome

comments

Read More

AppArmor引起的无法启动Evince

Thu 15 November 2012

今天在Ubuntu上使用文档查看器(Evince),总是打开没有响应,在命令行下使用命令: evince 却提示:

No protocol specified
Cannot parse arguments: 无法打开显示:

google说是$XAUTHORITY权限的问题,于是查看:

ls -l $XAUTHORITY
-rw------- 1 vim vim 51 2012-11-15 12:12 /data/home/vim/.Xauthority

更改为如下:

chmod +rw $XAUTHORITY

还是不行,这时候猛然想起查看日志,日志有如下一行:

Nov 15 15:48:53 Vostro kernel: [13010.203241] type=1400 …

Category: Linux Tagged: Ubuntu evince apparmor

comments

Read More

Linux高效工作----平铺式窗体管理器Awesome

Thu 25 October 2012

在Linux桌面环境下开发,总想更高效的工作,我已经装备了Gnome Do和terminator,但是我还是觉得不够快我更加希望能解放右手(当然不是找个妹子戒撸,只是右手的鼠标),而且terminator在跑的东西过多的时候开多个terminator不太好管理,这时候一个词进入了我的眼睛平铺式窗体管理器,与传统窗体管理器不同的是平铺式窗体管理器的窗口不会重叠,窗口会被自动调整成正好铺满全屏的尺寸,也就是说无论开多少窗口都会把屏幕占满,如果想象力贫乏就装一个试试吧:

Awesome是一款运行在Unix和类Unix(Linux/FreeBSD)等系统上的一款平铺式窗体管理器,有占用资源小,易于管理和操作等等有点,这里不罗嗦这些说说安装,Ubuntu安装很简单

sudo apt-get install awesome

安装好后登出会话选择awesome登录,然后你是否茫然无知没办法工作了?先简单介绍下使用方法:

Win键+1~9可以切换桌面,

没有菜单对吧 其实再右上角点一下就会出来一个菜单,打开程序会发现标题栏状态栏什么都木有了大大节省了桌面空间,可问题来了,怎么关闭啊不用担心

Win键+Shift+C可以关闭当前窗口

打开默认终端 Win键+Enter就可以打开终端

可以按住 Win键+Shift …

Category: Linux Tagged: 高效 管理器 窗体 桌面 平铺式 Linux awesome

comments

Read More

部署Tornado时iptables引发的的一个问题

Sat 29 September 2012

今天在CentOS上部署了一个Tornado,使用nginx做代理,

tornado使用8888,端口,使用nginx作为反向代理,配置文件如下:

server {
    listen 80;
    server_name www.linuxzen.com;

    location / {
        proxy_pass_header Server;
        proxy_redirect off;
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8888;
    }
}

iptables filter表的INPUT链是DROP的,所以添加如下规则:

iptables -A INPUT -p tcp  -s 127.0.0.1 --dport 8888 -j ACCEPT

但是访问nginx总是返回502 Bad …

Category: Linux Tagged: tornado nginx iptables bad gateway 502

comments

Read More

Linux桌面高效工作----使用Gnome DO

Sat 01 September 2012

不知大家是否和我一样在win下系统win+r输入命令来快速启动程序,这两天在Linux下碰到一个比这更爽,更快的软件,Gnome Do.

Gnome Do能根据用户键入的内容进行自动匹配,从而快速打开系统中已有的程序、文件、书签等。不仅如此,GNOME Do 还包括插件,从而能够做更多事,

比如你安装了pidgin插件只需输入联系人的名字即可打开与他/她的会话,安装了file这个插件输入文件/目录的名字即可打开目录或文件,

当然还有一个不足就是不支持中文

ubuntu用户可以按照下面安装:

sudo apt-get install gnome-do

启动之后Gnome do不会停留任务栏或通知栏只需按Win(ubuntu下称为super)+Space即可启动,输入你想启动的应用程序名字即可打开/关闭等操作.是不是很酷提高不少的工作效率

Category: Linux Tagged: 高效 桌面 Linux gnome do

comments

Read More

推荐两款不错的终端软件

Wed 29 August 2012

一直在Linux下做开发,一个好用的终端软件能帮你节省很多时间和精力

作为一个经常喜欢敲命令的人,可能要同时做很多操作,Linux各个桌面的窗口切换有多那啥,这里就不吐槽了, 我总是在想要做另外一个操作,但又不想结束当前的工作,之前我习惯于再打开一个终端,但是后来终端越来越多导致我想找回原来的工作的时候就变的很费力,而且对桌面有洁癖的人不允许任务栏太杂 后来发现了一款终端软件terminator,它支持分割终端,并可以在终端中快速切换.还有一款下拉式的终端软件Guake可以随意呼出隐藏.下面就一一介绍一下.

1 安装Terminator

sudo apt-get install terminator

2 使用

打开Termintor按Ctrl-E(注意是大E要按住Shift)可以垂直分割终端 Ctrl-O 可水平分割终端 按住Alt然后按上下左右可以在不同的分割窗中切换 Ctrl-D 可以关闭分割窗

2.1 配置

terminator配置文件在~/.config/terminator/config 可以通过这个配置文件配置terminator的字体和颜色

font = Monaco 10  #设置体字
background_color = "#204070" # 背景颜色 …

Category: Linux Tagged: 终端 分割 terminator Linux guake

comments

Read More

ssh证书登录错误

Fri 10 August 2012

错误描述

使用证书ssh链接的时候提示下面错误信息

Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 可能原因

authorizedkeys 或.ssh的权限太open .ssh 目录改成755 权限 authorizedkeys 改成600

解决

查看日志: cat /var/log/secure 发现 Aug 8 17:15:13 CentOS62 sshd[5624]: Authentication refused: bad ownership or modes for file /home/abc/.ssh/authorized_keys 查看.ssh权限为775 .ssh 手动创建的时候是775权限,改成755权限后正常 # chmod …

Category: Linux Tagged: 证书 权限 ssh authorized_keys

comments

Read More
Page 1 of 3

Next »

Fork me on GitHub