Cron连接正常工作5次后异常原因分析
目录
如果一个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次后异常原因分析的更多相关文章
- 修改List报ConcurrentModificationException异常原因分析
使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析 在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报jav ...
- 高通公司 MSM8K GPT异常原因分析无法开机的问题
问题分析过程如下面: 一. MSM8916台gpt概率问题:采用QPST emmc software download下载软件工具后,无法开机.例如下面的附图: log分析是userdata分区未成功 ...
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报java.util.ConcurrentModificationException异常,下面看一个例子演示: package ...
- Druid连接池 报错:abandon connection原因分析
问题现象:使用Druid的数据库连接池,在进行一个查询SQL的时候,抛出了异常: [2017-10-20 01:40:59.269 ERROR com.alibaba.druid.pool.Druid ...
- DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常
最近,DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常. 版本说明 commons-dbcp-1.4.jar commons-pool-1 ...
- 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 ...
- 2) broadcast,这是启动完毕之后,集群中的服务器开始接收客户端的连接一起工作的过程,如果客户端有修改数据的改动,那么一定会由leader广播给follower,所以称为”broadcast”.
2) broadcast,这是启动完毕之后,集群中的服务器开始接收客户端的连接一起工作的过程,如果客户端有修改数据的改动,那么一定会由leader广播给follower,所以称为”broadcast” ...
- C#连接solr时提示 java内存异常 (jetty和tomcat哪个更High) java.lang.OutOfMemoryError
C#连接solr时提示 java内存异常 java.lang.OutOfMemoryError 时间:20180130 09:51:13.329,消息:异常消息<?xml version=& ...
- 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 / ...
随机推荐
- 【RabbitMQ】——5种队列(转)
原文地址:https://blog.csdn.net/u012654963/article/details/76417613 应用RabbitMQ,我们可以根据需求选择5种队列之一. 一.简单队列 P ...
- centos7下的glusterfs的安装与使用
环境说明: 两台虚拟主机,IP分别为192.168.1.222和192.168.1.233,分别装上glusterfs. 一.下载glusterfs源码包 https://download.glust ...
- tomcat/eclipse提速[z]
在使用Eclipse开发项目过程中,一度使Eclipse陷入瘫痪状态,Tomcat启动项目时也异常缓慢,增加了超时限制并没有用,有时候项目根本运行不起来,简直让人崩溃,可能我电脑内存小(4G),配置低 ...
- c#dev tabcontrol 与嵌套gridcontrol 总结
Gridcontrol设置 1: 拖进去的时候别拖到tabcontrol外边, 否则dock 停靠的时候,停靠错了地方. 2:去掉Drag a column header here to group. ...
- centos7+nginx+rtmp+ffmpeg搭建流媒体服务器
1.安装前需要的工具 #net-tool 查本地IP #wget 下载安装包 #unzip 解压zip包 #gcc gcc-c++ perl 编译软件包用 yum install -y net-too ...
- ftp上传文件异常
ftp一个服务器 如果是22端口 ssh-2.0-openssh_4.3 ,是什么意思? ftp服务用的是20.21端口,客户端添加ftp信息的时候输入的是21端口 ssh服务用的是22端口,应用于远 ...
- ES6 Symbol的应用场景
一.简介 具体使用请参考:API ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(B ...
- andorid 对话框
activity_ui2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...
- yii2.0增删改查
//关闭csrf public $enableCsrfValidation = false; 1.sql语句 //查询 $db=\Yii::$app->db ->createCommand ...
- LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...