Linux神器之Strace的实践(Ubuntu上服务幽灵般的消失)
不论是运维,还是开发,面对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上服务幽灵般的消失)的更多相关文章
- linux 神器之wget
1.什么是Wget? 首页,它是网络命令中最基本的.最好用的命令之一; 文字接口网页浏览器的好工具. 它(GNU Wget)是一个非交互从网上下载的自由工具(功能).它支持http.ftp.https ...
- 神器之strace
原链接:https://www.jianshu.com/p/33521124bdf2来
- 新手入门之——Ubuntu上的编辑器之神Vi / Vim
Ubuntu上的编辑器有gedit.vi.sublime等.gedit一般在没有其他编辑器时临时使用,大部分情况下,vi和sublime使用的比较多,Linux系统内置了vi和sublime,其中,s ...
- .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 ...
- Ubuntu上安装和使用SSH,Xming+PuTTY在Windows下远程Linux主机使用图形界面的程序
自:http://blog.csdn.net/neofung/article/details/6574002 Ubuntu上安装和使用SSH 网上有很多介绍在Ubuntu下开启SSH服务的文章,但大 ...
- [转]Linux Ubuntu上架设FTP
Linux Ubuntu上架设FTP http://www.blogjava.net/stonestyle/articles/369104.html 操作系统:ubuntu (GNU/Linux) 为 ...
- 在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)
这里,我们不会为真实的硬件设备编写内核驱动程序.为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写.想起我们第一次学习程序语 ...
- 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序(老罗学习笔记2)
在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文 ...
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)
简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着,在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)一文中举例子说明了如何在 ...
随机推荐
- 【python】环境变量的配置
在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1.首先需要在系统中注册python环境变量:假设python的安装路径为c:\p ...
- LintCode "Heapify"
My first try was, using partial sort to figure out numbers layer by layer in the heap.. it only fail ...
- 【linux】如何查看和解压缩rpm文件内容
查看rpm文件中的内容 http://www.cyberciti.biz/faq/howto-list-find-files-in-rpm-package/ Use following syntax ...
- bzoj2044: 三维导弹拦截
Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指挥部,从而取得战斗的胜利!当然,A ...
- 黄聪:wordpress如何添加自定义文章快速编辑按钮
When working with WordPress posts and you want to quickly change the status or date of one or more p ...
- GL_GL系列 - 总账系统基础(概念)
2014-07-07 Created By BaoXinjian
- Going Home (hdu 1533 最小费用流)
集训的图论都快结束了,我才看懂了最小费用流,惭愧啊. = = 但是今天机械键盘到了,有弄好了自行车,好高兴\(^o^)/~ 其实也不是看懂,就会套个模板而已.... 这题最重要的就是一个: 多组输入一 ...
- iframe替代方案
自己写一个pagelet框架.封装成JSP的Taglib. <tms:view header="common-header" footer="common-foot ...
- Python基础05 缩进和选择
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例. ...
- MySQL处理数据库和表的常用命令
MySQL处理数据库和表的常用命令 [导读] 学习如何管理和导航MySQL数据库和表是要掌握的首要任务之一,下面的内容将主要对MySQL的数据库和表的一些常用命令进行总结,一些我们不得不掌握的命令,一 ...