不论是运维,还是开发,面对Linux系统,时常会因为配置参数或者系统的权限(iptables限制端口,selinux拦截,文件目录权限等)原因出现程序或者服务异常,无法启动等等。特别是在Linux的文件权限上,大型的程序或者服务依赖于大量的目录和相关文件,只要一个出现问题,就会发生连锁反应。

  strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

  (strace的具体使用命令参考另外一位博主:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html

  鄙人前两天就遇到了一个很奇葩的问题:

  某个未上线服务器上的Ubuntu 12.04.5系统上运行的OpenStack组件Nova-compute服务执行启动之后,shell反馈有pid,/var/log/nova/nova-compute.log没有任何记录;执行ps -ef |grep nova-compute ,没有进程,服务处于stop状态。

遇到问题的解决思路与过程是这样的:

1.直接使用CLI交互下,使用root用户执行启动nova-compute服务,执行代码是:

    python /usr/bin/nova-compute --flagfile=/etc/nova/nova.conf

  这样执行的结果是CLI下可以直接打印出本来应该写入到日志里面的东西,同时/var/log/nova/nova-compute.log日志中也是有了记录,其他session下也可以看到nova-compute进程,并且没有出现异常退出。发送到该节点的nova-compute任务也可以执行。基本证明:nova-compute的代码并没有被修改。root用户可以执行,是因为Linux系统上一般很难找到让root用户无法读写的情况。

  2.修改/etc/passwd 文件中nova用户使用bash,CLI下继续执行上面的命令。程序可以运行,日志可以记录,任务可以接受并执行,进程无异常退出。

    这里需要说明一下2步骤,理论上来说,先应该使用低权限用户来执行命令,避免root用户执行会修改日志文件或者某些目录的所属。

    但是此处的nova-compute服务通过ubuntu的init程序,也就是upstar启动,按照启动脚本的逻辑和方式最后的执行会是

    su -s /bin/sh -c exec nova-compute --flagfile=/etc/nova/nova.conf --flagfile=/etc/nova/nova-compute.conf nova

  即表示使用nova用户,在sh交互下,执行nova-compute程序。也就是说,在nova用户下已经没有跑通,但是在nova用户使用cli的情况下又可以跑通。这样奇怪的问题也是极其罕见的。

  3.根据经验,Linux下这种问题,一般都是因为目录或者权限的原因导致的异常,但是nova-compute相关的目录与文件太多。此处可是使用find命令找出系统中所有与nova相关的位置,然后分别对它们执行stat命令,查看权限与所属。命令为 find / -name nova |grep -v /proc |xargs -i -t stat '{}' 这样的做法看起来有效,但可能相关的位置的名称中并没有包含nova这个关键字的话,那还是一样定位不到的。直接放弃。(后来发现,如果当初这么做,也是能解决的。。。)

  4.在经历了一整天的一筹莫展,周一上班之后,拿起了手边的书,看到了有strace的介绍。之前并不知道这个程序是做什么的,但是看过介绍之后,发现应该能够适用于此问题。就在这台服务器上安装了strace,之后执行了

   /etc/init.d/nova-compute restart |grep process |awk '{print $4}'|xargs strace -o debug_info.text -f -p

  大概说明一下这条命令:首先重新启动nova-compute服务,取关键字process行,筛选该行第四个位置的数字就是进程的pid,将PID交给strace程序,-o 参数是讲调试的内容输出到一个文件中,-f 是对fork的进程也调试,-p是指定进程的pid。

  这样执行下来之后会输出一个debug的文件,这个很长的debug信息中的末尾出现了如下的内容:

 write(, "  File \"/usr/lib/python2.7/dist-"..., ) =
open("/usr/lib/python2.7/dist-packages/nova/compat/flagfile.py", O_RDONLY) =
fstat(, {st_mode=S_IFREG|, st_size=, ...}) =
mmap(NULL, , PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -, ) = 0x7f339e37a000
read(, "# vim: tabstop=4 shiftwidth=4 so"..., ) =
write(, " ", ) =
write(, "return open(path, 'r')\n", ) =
close() =
munmap(0x7f339e37a000, ) =
write(, "IOError", ) =
write(, ": ", ) =
write(, "[Errno 13] Permission denied: '/"..., ) =
write(, "\n", )

  这里出现了提示权限被禁止,找到上面open的文件"/usr/lib/python2.7/dist-packages/nova/compat/flagfile.py",这个文件的权限和代码与其他节点也是相同的。

  那么根据之前的几步的判定,问题应该在某个文件的权限上。使用关键字“Permission denied”接着找,有了下面这一段:

  

 open("/etc/nova/nova-compute.conf", O_RDONLY) = - EACCES (Permission denied)
lstat("/tmp/nova-conf-2mWZLQ", {st_mode=S_IFDIR|, st_size=, ...}) =
openat(AT_FDCWD, "/tmp/nova-conf-2mWZLQ", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) =
getdents(, /* 3 entries */, ) =
getdents(, /* 0 entries */, ) =
close() =

  这里提到了etc/nova/nova-compute.conf这个文件的权限错误,再检查,这个文件的所有者变成 root:root,修改配置文件的所属之后,使用service nova-compute restart之后,日志正常记录,服务没有异常丢失。

Linux神器之Strace的实践(Ubuntu上服务幽灵般的消失)的更多相关文章

  1. linux 神器之wget

    1.什么是Wget? 首页,它是网络命令中最基本的.最好用的命令之一; 文字接口网页浏览器的好工具. 它(GNU Wget)是一个非交互从网上下载的自由工具(功能).它支持http.ftp.https ...

  2. 神器之strace

    原链接:https://www.jianshu.com/p/33521124bdf2来

  3. 新手入门之——Ubuntu上的编辑器之神Vi / Vim

    Ubuntu上的编辑器有gedit.vi.sublime等.gedit一般在没有其他编辑器时临时使用,大部分情况下,vi和sublime使用的比较多,Linux系统内置了vi和sublime,其中,s ...

  4. .NET跨平台:在Linux Ubuntu上编译coreclr/corefx/dnx(20150617)

    编译时间:北京2015年6月17日上午 操作系统:Ubuntu 14.04.2 LTS Mono版本:Mono JIT compiler version 4.3.0 (master/3445ac5 T ...

  5. Ubuntu上安装和使用SSH,Xming+PuTTY在Windows下远程Linux主机使用图形界面的程序

    自:http://blog.csdn.net/neofung/article/details/6574002 Ubuntu上安装和使用SSH  网上有很多介绍在Ubuntu下开启SSH服务的文章,但大 ...

  6. [转]Linux Ubuntu上架设FTP

    Linux Ubuntu上架设FTP http://www.blogjava.net/stonestyle/articles/369104.html 操作系统:ubuntu (GNU/Linux) 为 ...

  7. 在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)

    这里,我们不会为真实的硬件设备编写内核驱动程序.为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写.想起我们第一次学习程序语 ...

  8. 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序(老罗学习笔记2)

    在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文 ...

  9. 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)

    简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着,在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)一文中举例子说明了如何在 ...

随机推荐

  1. 【python】环境变量的配置

    在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1.首先需要在系统中注册python环境变量:假设python的安装路径为c:\p ...

  2. LintCode "Heapify"

    My first try was, using partial sort to figure out numbers layer by layer in the heap.. it only fail ...

  3. 【linux】如何查看和解压缩rpm文件内容

    查看rpm文件中的内容 http://www.cyberciti.biz/faq/howto-list-find-files-in-rpm-package/  Use following syntax ...

  4. bzoj2044: 三维导弹拦截

    Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指挥部,从而取得战斗的胜利!当然,A ...

  5. 黄聪:wordpress如何添加自定义文章快速编辑按钮

    When working with WordPress posts and you want to quickly change the status or date of one or more p ...

  6. GL_GL系列 - 总账系统基础(概念)

    2014-07-07 Created By BaoXinjian

  7. Going Home (hdu 1533 最小费用流)

    集训的图论都快结束了,我才看懂了最小费用流,惭愧啊. = = 但是今天机械键盘到了,有弄好了自行车,好高兴\(^o^)/~ 其实也不是看懂,就会套个模板而已.... 这题最重要的就是一个: 多组输入一 ...

  8. iframe替代方案

    自己写一个pagelet框架.封装成JSP的Taglib. <tms:view header="common-header" footer="common-foot ...

  9. Python基础05 缩进和选择

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例. ...

  10. MySQL处理数据库和表的常用命令

    MySQL处理数据库和表的常用命令 [导读] 学习如何管理和导航MySQL数据库和表是要掌握的首要任务之一,下面的内容将主要对MySQL的数据库和表的一些常用命令进行总结,一些我们不得不掌握的命令,一 ...