目录

目录 1

问题描述 1

分析定位 1

解决方法 2

附1:Cron工作流 3

附2:SIGPIPE发生的位置 3

如果一个shell命令的“$?”值为141,则它是收到了SIGPIPE信号。一些shell脚本中的sleep或ps、wc等命令无效,也可能是本文描述的原因,解决办法是忽略掉SIGPIPE,脚本中可以加句:trap "" SIGPIPE。

问题描述

在Crontab中仅配置如下一条命令(为简化问题的描述和定位,剔除所有其它的):

*/1 * * * * echo hello >> /tmp/hello.txt

也就是每分钟执行一下“echo hello >> /tmp/hello.txt”。

通过观察发现:

每次重启cron进程后,都只能连续正常工作5次,也就是可以看到“/tmp/hello.txt”新增5行“hello”。

分析定位

借助strace工具,cron进程仍然在工作,只是发生了异常:

[pid 12497] select(5, NULL, [4], NULL, {0, 10000}) = 1 (out [4], left {0, 10000})

[pid 12497] --- SIGPIPE (Broken pipe) @ 0 (0) ---

Process 12497 detached

--- SIGCHLD (Child exited) @ 0 (0) ---

发生了SIGPIPE,导致了子进程退出。翻阅cron的源代码,确认cron没有调用“signal(SIGPIPE, SIG_IGN);”来忽略SIGPIPE,因此当收到SIGPIPE信号时,进程必然退出。

进一步追踪发现,PIPE连接的是“/usr/local/sa/agent/log/sap1012.sock”,另一端则是sap1012

# lsof /usr/local/sa/agent/log/sap1012.sock

COMMAND   PID USER   FD   TYPE     DEVICE SIZE       NODE NAME

sap1012 15415 root    5u  unix 0xd940de40      3985983520 /usr/local/sa/agent/log/sap1012.sock

sap1012 15415 root   11u  unix 0xe22fa3c0      3970596394 /usr/local/sa/agent/log/sap1012.sock

# ls -l /proc/15415

lrwxrwxrwx  1 root root 0 Apr 17 12:43 exe -> /usr/local/sa/agent/plugins/sap1012-v5.1.4

使用valgrind可以看到对PIPE的写(send)是在“/lib/libsandbox_web_ips.so”中进行的,利用ldd可以发现这个共享库在编译期间就被链接进了cron程序文件中:

# ldd /usr/sbin/cron

linux-gate.so.1 =>  (0xffffe000)

/lib/libbash_strip_env.so (0xb7f8c000)

/lib/libsandbox_web_ips.so (0xb7f85000)

libpam.so.0 => /lib/libpam.so.0 (0xb7f70000)

libpam_misc.so.0 => /lib/libpam_misc.so.0 (0xb7f6d000)

libc.so.6 => /lib/libc.so.6 (0xb7e4b000)

libdl.so.2 => /lib/libdl.so.2 (0xb7e47000)

libpthread.so.0 => /lib/libpthread.so.0 (0xb7e32000)

libaudit.so.0 => /lib/libaudit.so.0 (0xb7e1f000)

/lib/ld-linux.so.2 (0xb7f90000)

在Google和Baidu中找不到任何有关“libsandbox_web_ips.so”的踪影,猜测是有可能是私有的。Cron的Makefile本身并没有包含libsandbox_web_ips.so”和“/lib/libbash_strip_env.so”,如:

cc  -o cron cron.o database.o user.o entry.o job.o do_command.o misc.o env.o popen.o compat.o

经实践确认,编译生成可执行文件后,可执行文件都会依赖“libsandbox_web_ips.so”和“/lib/libbash_strip_env.so”两个共享库,而且它们可能会在被加载时自动执行,但因为符号被stripped掉了,看不到细节。

终于在/etc/ld.so.preload中找到了两者:

# cat /etc/ld.so.preload

/lib/libbash_strip_env.so

/lib/libsandbox_web_ips.so

它们两个如同木马,会伴随任一程序一起运行,但libsandbox_web_ips.so可能存在问题,导致cron运行异常。

解决方法

kill掉sap1012进程,然后重启cron进程,这样cron就可以正常工作了。cron必须在sap1012之前启动,以规避问题。通过strace会发现变成如下:

[pid 11704] socket(PF_FILE, SOCK_STREAM, 0) = 3

[pid 11704] fcntl64(3, F_GETFL)         = 0x2 (flags O_RDWR)

[pid 11704] fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0

[pid 11704] connect(3, {sa_family=AF_FILE, path="/usr/local/sa/agent/log/sap1012.sock"}, 110) = -1 ECONNREFUSED (Connection refused)

[pid 11704] close(3)

更好的解决办法将/lib/libbash_strip_env.so和/lib/libsandbox_web_ips.so,从/etc/ld.so.preload中剔除,但是它们就不能发挥作用了。

附1:Cron工作流

真正运行Cron命令的是vfork(有些版本为fork调用)出来的进程,写标准输出的fork是可选的,只有当存在“%”配置时才会生效,目的是通过写标准输出往vfork产生的进程输入内容。

附2:SIGPIPE发生的位置

SIGPIPE正是发生在下图所示的“send()”调用,至于是因为sap1012关闭了读端,还是其它原因,暂不清楚原因。

Cron连接正常工作5次后异常原因分析的更多相关文章

  1. 修改List报ConcurrentModificationException异常原因分析

    使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析 在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报jav ...

  2. 高通公司 MSM8K GPT异常原因分析无法开机的问题

    问题分析过程如下面: 一. MSM8916台gpt概率问题:采用QPST emmc software download下载软件工具后,无法开机.例如下面的附图: log分析是userdata分区未成功 ...

  3. 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析

    在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报java.util.ConcurrentModificationException异常,下面看一个例子演示: package ...

  4. Druid连接池 报错:abandon connection原因分析

    问题现象:使用Druid的数据库连接池,在进行一个查询SQL的时候,抛出了异常: [2017-10-20 01:40:59.269 ERROR com.alibaba.druid.pool.Druid ...

  5. DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常

    最近,DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常. 版本说明 commons-dbcp-1.4.jar commons-pool-1 ...

  6. c# 使用MS SqlServer,连接成功,但是还报异常A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0。。。。

    c# 使用MS SqlServer,连接成功,但是还报异常A connection was successfully established with the server, but then an ...

  7. 2) broadcast,这是启动完毕之后,集群中的服务器开始接收客户端的连接一起工作的过程,如果客户端有修改数据的改动,那么一定会由leader广播给follower,所以称为”broadcast”.

    2) broadcast,这是启动完毕之后,集群中的服务器开始接收客户端的连接一起工作的过程,如果客户端有修改数据的改动,那么一定会由leader广播给follower,所以称为”broadcast” ...

  8. C#连接solr时提示 java内存异常 (jetty和tomcat哪个更High) java.lang.OutOfMemoryError

    C#连接solr时提示 java内存异常   java.lang.OutOfMemoryError 时间:20180130 09:51:13.329,消息:异常消息<?xml version=& ...

  9. odoo开发笔记 -- 还原数据库后,异常:ir_attachment: IOError: [Errno 2] No such file or directory: u'/var/...'

    场景描述: 恢复Odoo数据后,抛出错误导致无法进入页面 -- ::, INFO aeo odoo.addons.base.ir.ir_attachment: _read_file reading / ...

随机推荐

  1. mysql decimal(10,2)对应java类型

    下面我给出MYSQL类型与JAVA类型对应表,希望能够帮到您: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.S ...

  2. TouchSlide 插件使用介绍

    TouchSlide(PC端插件http://www.superslide2.com/demo.html#effect1) 可用于javascript触屏滑动特效插件,移动端滑动特效,触屏焦点图,触屏 ...

  3. Windows下PythonQt编译(vs2015+Qt5.11.2+PythonQt 3.2)探索

    时间:2018年10月20日 笔者最近在做Qt方面的开发工作,需用到脚本程序对程序内部进行扩展,就很自然的想到了PythonQt,下面介绍PythonQt在Windows下的的安装编译心得,水平有限, ...

  4. Varnish 入门

    本文将介绍 varnish 的工作流程,安装以及 varnish 的配置三个方面的内容.首先简单的介绍 varnish 以及其工作流程,大概了解其内部原理,然后介绍了 varnish 的安装方法,最后 ...

  5. c# 子线程打开子窗体

    下边是在子线程打开子窗口,结果跑到else 里边了跨线程操作窗体控件InvokeRequired失效,无法用于打开子窗体,addonetwo.InvokeRequired,访问不了呢? 大神知道帮忙回 ...

  6. (转)android:inputType参数类型说明

    android:inputType参数类型说明 android:inputType="none"--输入普通字符 android:inputType="text" ...

  7. poj 2492(关系并查集) 同性恋

    题目;http://poj.org/problem?id=2492 卧槽很前卫的题意啊,感觉节操都碎了, t组测试数据,然后n,m,n条虫子,然后m行,每行两个数代表a和b有性行为(默认既然能这样就代 ...

  8. 零基础照样做RNA-seq差异分析

    零基础照样做RNA-seq差异分析 GCBI知识库2018-08-24 14:43:36 基因表达谱的差异分析是RNA-seq中最常见的应用.你眼中的RNA-seq差异分析或许是酱紫的,对不会编程,不 ...

  9. String、StringBuffer、StringBuilder和StringTokenizer的区别

    1)String.StringBuffer.StringBuilder都用于字符串操作,其中,String是不可变类,即String对象一旦被创建,其值不能被修改,而StringBuffer和Stri ...

  10. jmeter使用HTTP代理服务器

    浏览器>web服务器 浏览器>HTTP代理服务器>web服务器 jmeter>HTTP代理服务器>web服务器 浏览器>jmeter HTTP服务器>web服 ...