问题:
在crontab中的备份脚本备份4个用户数据,突然发现每天只备份了2个,另外2个没有备份。
bi_expdp.sh(脚本先清理之前的dmp文件,然后执行4条expdp命令导出用户数据) 手动执行一切正常,但放到crontab中执行只生成前2个dmp文件。
[oracle@dghpl406 ~]$ crontab -l
>>>
21 14 * * * /bin/sh /u01/app/oracle/scripts/bi_expdp.sh
分析:
1、尝试调换bi_expdp.sh 中的expdp命令顺序,也只是执行前两条expdp(或者1条),说明与具体某条expdp命令无关。感觉上执行了两分钟之后脚本就自动退出了。
2、strace -frT -o /tmp/cron1.trc -p $pid 生成strace日志,显示如下:
53764 0.000048 read(255, "echo $? >> /tmp/exp.log\necho 2 >"..., 2834) = 1457 <0.000020>
53764 0.000120 write(2, "+ echo 0\n", 9) = -1 EPIPE (Broken pipe) <0.000016>
53764 0.000051 --- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=53764, si_uid=6000} ---
53764 0.000228 +++ killed by SIGPIPE +++
查看linux的信号含义,SIGPIPE为管道信息没有进程接收
Signal Value Action Comment
SIGPIPE 13 Term Broken pipe: write to pipe with no readers
bi_expdp.sh进程输出 echo $? 到管道,但是没有进程读取管道信息,导致进程bi_expdp.sh退出。
解决:
1、调试shell脚本,并将标准输出和标准错误输出到文件/tmp/expdp.log,
[oracle@dghpl406 ~]$ crontab -l
30 12 * * * /bin/sh -x expdp.sh >/tmp/expdp.log 2>&1
脚本正常执行,有输出日志到expdp.log,日志内容也无任何异常。
2、尝试一下三种情况
[oracle@dghpl406 ~]$ crontab -l
30 12 * * * /bin/sh expdp.sh 不重定向任何输出,执行清理dmp,但只执行前两个expdp
30 12 * * * /bin/sh expdp.sh >/tmp/expdp.log 重定向标准输出不重定向错误,连清理dmp都不执行,expdp都不执行
30 12 * * * /bin/sh expdp.sh >/tmp/expdp.log 2>&1 重定向标准输出和标准错误,清理dmp执行expdp,完全正常
输出和标准错误都重定向到文件时正常,其他情况不正常。而手动执行脚本时,标准输出和标准错误都输出到终端,所以也正常。
而不加重定向时,crontab的执行结果输出是通过sendmail发送给oracle用户的。
3、检查ORACLE用户的邮箱 ls -al /var/spool/mail/oracle 为空。
检查mail日志中有报错
#cat /var/log/maillog
Feb 2 11:50:01 dghpl406 postfix/sendmail[35763]: fatal: parameter inet_interfaces: no local interface found for ::1
4、修改sendmail错误,修改inet_protocols=ipv4 ,重启postfix服务
#vi /etc/postfix/main.cf
# Enable IPv4, and IPv6 if supported
#inet_protocols = all
inet_protocols = ipv4
[root@dghpl406 ~]# service postfix restart
Shutting down postfix: [FAILED]
Starting postfix: [ OK ]
5、重启postfix邮件服务后,执行crontab,无论标准输出和错误输出到哪里,执行都正常成功。
尝试关闭postfix服务后,再执行crontab,也执行成功。说明postfix邮件服务异常时,执行失败;postfix服务正常或者关闭时,执行正常。
猜想:postfix服务异常,但crontab执行脚本仍然可以调用邮件接口,直到输出写入到管道等待邮件服务读取时超时,返回SIGPIPE错误,进程退出。
其他crontab作业之所以没有出现以上问题,可能跟标准输出的大小有关,expdp命令导致输出大小太大。