公司网站设计与开发,成都专业seo公司,教学资源库 网站建设,北京知名企业100强原因#xff1a; crontab 没有去读环境变量#xff0c;需要再脚本中手动引入环境变量#xff0c;可以用source 也可以用export 写死环境变量。为了定时监控Linux系统CPU、内存、负载的使用情况#xff0c;写了个Shell脚本#xff0c;当达到一定值得时候#xff0c;发送邮…原因 crontab 没有去读环境变量需要再脚本中手动引入环境变量可以用source 也可以用export 写死环境变量。为了定时监控Linux系统CPU、内存、负载的使用情况写了个Shell脚本当达到一定值得时候发送邮件通知。需要用到Crontab的定时任务去执行这个脚本但是发现通过命令(./test.sh)执行Shell文件的时候可以获取Linux的环境变量;可是通过Crontab做的定时任务无法获取。查找资料之后发现crontab有一个坏毛病就是它总是不会缺省的从用户profile文件中读取环境变量参数经常导致在手工执行某个 脚本时是成功的但是到crontab中试图让它定期执行时就是会出错。2种方法可以解决这个问题1、在Shell文件里面获取环境变量值的路径写成绝对路径别用环境变量的路径值。例如获取CPU的使用情况 通过绝对路径/proc/cpuinfo 来获取值2、Shell脚本缺省的#!/bin/sh开头换行后的第一行用#!/bin/sh. /etc/profile. ~/.bash_profile这样crontab在执行脚本的时候就能够读到用户的环境变量参数备注如果你是在cron里提交的,请注意:不要假定c r o n知道所需要的特殊环境它其实并不知道。所以你要保证在s h e l l脚本中提供所有必要的路径和环境变量除了一些自动设置的全局变量。分享一些关于Crontab的小知识但是最近在使用crontab过程中接连遇到头疼的问题手动执行脚本时一点问题都没有可是放在 crontab中脚本死活也不运行。最后查出来原因一次是因为脚本里面文件路径没有写全路径导致的另一次是因为脚本运行需要依赖java环境变量其实 两次都是环境变量的问题造成的。从网上同样了解到一般crontab无法运行的问题都是由环境变量在crontab中不一定可识别引起的。某前辈总结 说crontab如果不注意的话早晚会出问题而且这种问题一旦出一次就会永远记得因为这种问题很折腾人。精辟啊~~下面我也来试试总结下crontab的基本用法环境变量以及其他要注意的问题。各位看官可以参考下有什么问题也可以留言讨论。————————————————————————————1.crontab的基本用法Usage: crontab [-u user] [-e|-l|-r]Crontab 的格式说明如下:* 逗号(‘,’) 指定列表值。如: “1,3,4,7,8″* 中横线(‘-’) 指定范围值 如 “1-6″, 代表 “1,2,3,4,5,6″* 星号 (‘*’) 代表所有可能的值*/15 表示每 15 分钟执行一次# Use the hash sign to prefix a comment# —————- minute (0 – 59)# | ————- hour (0 – 23)# | | ———- day of month (1 – 31)# | | | ——- month (1 – 12)# | | | | —- day of week (0 – 7) (Sunday0 or 7)# | | | | |# * * * * * command to be executed2.crontab与环境变量不要假定cron知道所需要的特殊环境它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量除了一些自动设置的全局变量。所以注意如下3点1)脚本中涉及文件路径时写全局路径2)脚本执行要用到java或其他环境变量时通过source命令引入环境变量如cat start_cbp.sh#!/bin/shsource /etc/profileexport RUN_CONF/home/d139/conf/platform/cbp/cbp_jboss.conf/usr/local/jboss-4.0.5/bin/run.sh -c mev 3)当手动执行脚本OK但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸并可以尝试在crontab中直接引入环境变量解决问题。如0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh3.其他应该注意的问题1)新创建的cron job不会马上执行至少要过2分钟才执行。如果重启cron则马上执行。2)每条 JOB 执行完毕之后系统会自动将输出发送邮件给当前系统用户。日积月累非常的多甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的 /dev/null 21 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。3)当crontab突然失效时可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。4)千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。5)在crontab中%是有特殊含义的表示换行的意思。如果要用的话必须进行转义\%如经常用的date ‘%Y%m%d’在crontab里是不会执行的应该换成date ‘\%Y\%m\%d’。—————————————————————————————–/etc/profile, /etc/bashrc, .bash_profile和.bashrc的差别用户登陆Linux操作系统的时候”/etc/profile”, “~/.bash_profile”等配置文件会被自动执行。执行过程是这样的登陆Linux系统时首先启动”/etc/profile”然后启动 用户目录下的”~/.bash_profile”如果”~/.bash_login”和”~/.profile”文件存在的时候也会在执行”~ /.bash_profile”后被依次调用。——————cat .bash_profile# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then. ~/.bashrcfi# User specific environment and startup programsPATH$PATH:$HOME/binexport PATHalias vivim通过上面脚本可以看到~/.bash_profile文件先调用~/.bashrc然后再把PATH加载。——————下面是一些区别/etc/profile此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行并从/etc/profile.d目录的设置文件中搜集/etc/bashrc为每一个运行bash shell的用户执行此文件当bash shell被打开时该文件被读取~/.bash_profile每个用户都可使用该文件输入专用于自己使用的shell信息当用户登录时该文件仅仅执行一次默认情况下他设置一些环境变量执行用户的.bashrc文件~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时及每次打开新的shell时,该文件被读取~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件——–/etc/profile是全局性的功能其中设置的变量作用于所有用户~/.bash_profile中设置的变量能继承/etc/profile中的变量并作用于用户。~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的。