不论是运维,还是开发,面对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. ApiCloud重新定义移动应用开发

    http://www.apicloud.com/ 为APP开发者提供云端的API服务和数据存储服务,动态生成RESTful API,支持在线NoSQL数据表设计.API调试及用量分析:同时提供推送.云 ...

  2. 文件压缩与挤压ZIP

    /// <summary> /// Zip压缩与解压缩 /// </summary> public class ZipHelper { /// <summary> ...

  3. Linux启动过程详解(转)

    启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...

  4. (C# File) 文件操作

    Get Files from Directory [C#] This example shows how to get list of file names from a directory (inc ...

  5. (C#) 调用执行批处理文件

    Task:  在Windows的Service里面定时的调用执行一个批处理文件. private ApplicationOutput RunCommandOnPC(string executableP ...

  6. hibernate.cfg.xml讲解

    <session-factory> <!-- 配置数据库连接信息 --> <!-- 数据库驱动 --> <property name="connec ...

  7. Segment fault及LINUX core dump详解 (zz)

    C 程序在进行中发生segment fault(core dump)错误,通常与内存操作不当有关,主要有以下几种情况: (1)数组越界. (2)修改了只读内存. (3)scanf("%d&q ...

  8. sublime相关设置

    1.设置Sublime Text新标签页打开文件 "open_files_in_new_window": false,

  9. centos下安装MySQL5.7

    1.查找mysqlwhereis mysql 2.删除mysqlyum remove mysql mysql-server mysql-libs mysql-server;rm –rf /usr/li ...

  10. 测试相关、sdk卡读取

    测试: monkey 猴子 测试整个系统 adb shell monkey -v 1000 (-v 指定模拟测试的事件数量) 测试某个程序 adb shell monkey -p <程序的包名& ...