要用到Crontab定时任务去执行一个Shell脚本监控Linux系统资源并且当一些数字超过预设的话发送邮件警告。首先是linux的sendmail功能无法满足我们使用SMTP服务器并且指定发送者(E.g. OS_Monitoring@ABC.com)的邮箱。查了下发现mailx可以跨过系统原来的sendmail服务透过登录外部SMTP来发邮件,不过Redhat5自带的mailx版本有问题,只好升级到最新的版本mailx-12.4而且关闭sendmail服务。(具体可以参照http://url.cn/UroamQ

装完之后mailx命令行就可以发送邮件了。开始折腾Shell脚本,但是发现通过命令执行该Shell文件的时候监控结果可以发送邮件,可是通过Crontab做成定时的任务,却跑了之后没有邮件发送。查google查百度后发现,crontab是不会缺省的从用户profile文件中读取环境变量参数,经常导致在手工执行某个脚本时是成功的,但是到crontab中试图让它定期执行时就是会出错。

于是乎把Shell里面用到的所有路径都该成绝对路径,但还是不行。而且发现Crontab运行发送邮件命令的时候,总有以下报错:

XXX@XX.com... Connecting to [127.0.0.1] via relay...

XXX@XX.com... Deferred: Connection refused by [127.0.0.1]

手动跑这个shell就没这个报错。以为是要把SMTP服务器加进/etc/hosts. 加了却也一样报错。

记得这个错误信息应该是之前sendmail服务没开启时候运行Mail (不是Mailx)命令出现过。 所以开始怀疑是crontab用错了Mail而非Mailx, 有点眉目就简单了。

在Shell里把crontab运行时的Path echo出来再跟手动运行时候的Path做个对比:

一比就知道问题可能出在哪里了,手动运行的Path里面,/usr/local/bin在前/bin在后,而crontab运行时Path里面/bin在前面。

再进去/bin里面看下mailx,发现原来是link到sendmail的mail去了。难怪crontab总调用sendmail来跑

[root@ xxxxxxxx bin]# ls -latr mailx

lrwxrwxrwx 1 root root 4 Jan  1  2012 mailx -> mail

[root@ xxxxxxxx bin]#

知道问题就容易解决了,在shell里面加入export PATH=/usr/local/bin:$PATH (等于把/usr/local/bin 和/bin对调,让/usr/local/bin里面的mailx被调用)

测试了下能收到邮件!事实证明crontab跑脚本还是要很小心的。特别是会调用到java或者第三方程序的crontab。

Crontab使用mailx的一点发现的更多相关文章

  1. iOS关于error can't allocate region的一点发现

    调试的时候出现error can't allocate region错误,后来去搜了下网上关于这个错误的帖子,是这么说的:error can't allocate region 程序运行报错,在xco ...

  2. 关于使用jQuery操作dom时的一点发现

    <body> <ul> <li>list item 1</li> <li>list item 2</li> <li> ...

  3. linux中历史命令的一点发现

    在LINUX中的终端中输入命令之后,这些命令会被存储到一个文件中,在终端中按下 键盘上的向上的箭头就会显示出以前敲击过的命令,最关键的是重起电脑之后依然有效的,这点和 windows上的CMD有着很大 ...

  4. tp3.2框架中使用volist输出混乱的一点发现

    在tp框架中,volist真的是一样很好用的东西,但是要是不注意,用起来也会有问题的 在Controller层中,将数据assign到页面 $this->assign('vo',$news); ...

  5. 关于android的2.2与4.4的文件读取的一点发现

    好久没有写文章了,本来想写的东西,时间一长,就感觉不想写了.没什么用,到用时.又不知道去哪找了或怎么解决. 有一句话说的好啊,好记性不如烂笔头. 我要做到善于总结.及时整理,额............ ...

  6. CentOS(八)--crontab命令的使用方法

    crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. 在 ...

  7. scrapy使用crontab定时任务不能自动执行的调试

    在用crontab进行定时任务时,发现任务并没有执行.而手动bash yourshell.sh时可以正常的执行程序.以下是个人的解决流程. 一.将错误打印打out.log */10 * * * * b ...

  8. 每天一个linux命令(56)--crontab命令

    上一节学习了 at  命令是针对仅运行一次的任务,循环运行的例行性计划任务,Linux 系统则是由 cron(crond)这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...

  9. You (root) are not allowed to access to (crontab) because of pam configuration

    巡检发现一台Linux服务器上的作业没有如期发送邮件,登录服务器检查后发现作业并没有执行,于是检查一下crontab的设置.结果发现如下错误: [root@mylnx2 ~]# crontab -l ...

随机推荐

  1. Js面向对象和数据类型内存分配(转)

    一 Js基本数据类型以及内存情况 1 Undefined Undefined类型只有一个值undefined,在使用了声明但未初始化的变量的时候,这个变量值就是undefined 1 var hi; ...

  2. phpStudy 2014的Apache虚拟主机配置

    安装phpStudy直接百度下载,傻瓜式安装很简单,一直点击下一步即可,中途根据个人爱好设置WWW目录,我的设置在D盘根目录里. 打开虚拟主机配置,打开D:\phpStudy\Apache\conf下 ...

  3. 通过缓存数据库结果提高PHP性能(转)

    众所周知,缓存数据库查询的结果可以显著缩短脚本执行时间,并最大限度地减少数据库服务器上的负载.如果要处理的数据基本上是静态的,则该技术将非常有效.这是因为对远程数据库的许多数据请求最终可以从本地缓存得 ...

  4. UVA 1401 - Remember the Word(Trie+DP)

    UVA 1401 - Remember the Word [题目链接] 题意:给定一些单词.和一个长串.问这个长串拆分成已有单词,能拆分成几种方式 思路:Trie,先把单词建成Trie.然后进行dp. ...

  5. springmvc03 非注解和注解处理器映射器和适配器

    1其它非注解处理器映射器和适配器 .1BeanNameUrlHandlerMapping(映射器) 根据请求url(XXXX.action)匹配spring容器bean的 name 找到对应的bean ...

  6. IDispatch接口 - GetIDsOfNames和Invoke(转)

    IDispatch接口是COM自动化的核心.其实,IDispatch这个接口本身也很简单,只有4个方法: IDispatch : public IUnknown { public: virtual H ...

  7. shared_ptr的简单实现

    前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针 ...

  8. 哈夫曼(Huffman)编码

    哈夫曼编码(Huffman Coding)是一种非常经典的编码方式,属于可变字长编码(VLC)的一种,通过构造带权路径长度最小的最优二叉树以达到数据压缩的目的.哈弗曼编码实现起来也非常简单,在实际的笔 ...

  9. 1083. List Grades (25)

    the problem is from PAT,which website is http://pat.zju.edu.cn/contests/pat-a-practise/1083 and the ...

  10. oracle_partition sample

    (1.) 表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间. 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢 ...