5.备份脚本crontab不执行问题分析

问题:

在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命令导致输出大小太大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dba任意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值