contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常
原因: 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) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
2.crontab与环境变量
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export 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.sh
3.其他应该注意的问题
1)新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
2)每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 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 functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
alias vi=vim
通过上面脚本可以看到~/.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 运行的。
contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常相关推荐
- Linux Crontab定时执行脚本出错,但手动执行脚本正常原因及解决方案
Linux Crontab定时执行脚本出错,但手动执行脚本正常原因及解决方案 实际开发场景 需要开发一个Flink监控程序,初步使用shell脚本进行监控,如果发现失败了,则自动重新运行Flink命令 ...
- linux脚本出错仍执行后续脚本,crontab执行脚本出错
crontab定时调用执行shell脚本出错(mailed 165 bytes of output but got status 0x004b#012) 使用系统自带的任务调度crontab 发现手动 ...
- 执行Linux脚本出错,出现No Such file or directory异常
执行Linux脚本出错,出现No Such file or directory异常 参考文章: (1)执行Linux脚本出错,出现No Such file or directory异常 (2)http ...
- linux脚本调用db2存储过程,LINUX定时执行含有DB2存储过程的SHELL脚本
<LINUX定时执行含有DB2存储过程的SHELL脚本>由会员分享,可在线阅读,更多相关<LINUX定时执行含有DB2存储过程的SHELL脚本(6页珍藏版)>请在人人文库网上搜 ...
- bash 抓捕异常_实现简单的监控脚本(Bash的执行和异常捕获)
当我们需要监控服务运行状态时,一般的策略是写定时脚本,定时执行探测服务状态,如果出现预期外情况,就报警.那么第一步我们就需要学会写一个监控脚本,这里我们会讲到bash的执行环境和异常捕获,以及一些简单 ...
- linux使用flock文件锁解决脚本周期内未执行完重复执行
linux使用flock文件锁解决脚本周期内未执行完重复执行 关于flock flock 是对于整个文件的建议性锁.也就是说,如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的.( ...
- (shell脚本编程)linux如何利用脚本执行多条命令以及linux如何执行定时任务
文章目录 shell脚本编程 条件语句 脚本执行多条命令 执行定时任务 本文着重于提高我们的生产力,所以将这几个作为了一个专题. shell脚本编程 脚本中不同语句用分号隔开,和c语言一样. for, ...
- 服务器免密码传输文件,CentOS7,使用 scp 命令, ssh 连接方式,免密码传输文件到远程服务器,免密执行远程服务器上的 shell 脚本...
如题 如果提示:-bash: scp: command not found, 执行下面的命令安装:1 yum install -y openssh-clients 免密码配置通常用 scp 命令通过 ...
- 对未标记为可安全执行的脚本_Script Debugger for Mac(脚本调试软件)
你是否需要一款可以轻松编译AppleScript的工具吗?来试试Script Debugger for Mac吧!Script Debugger Mac版是一款运行在mac平台的调试软件.Script ...
最新文章
- pyinstaller 打包tensorflow2.0为单个文件
- mongodb索引--从55.7秒到毫秒级别
- 计算机林中鸟歌曲,励志歌曲曲-林中鸟
- 我来悟微服务(3)-需求管理
- mysql使用数据库预处理_php中对MYSQL操作之预处理技术(2)数据库dql查询语句
- LCAOSCF自洽场氟化氢HF斯莱特函数
- 神策数据:游戏企业如何做产品 A/B 测试?三大案例一次搞懂
- 交换机工作原理_什么是POE交换机,它有什么好处?
- mongodb系列教程
- php-fpm backlog 项的调整
- c++求区间第k大数_数组中求第K大数的实现方法
- 工具分享 --- 分享一个在线制作ico的网站
- 在visual studio code中配置python以及解决中文乱码问题
- MyBatis3官方文档
- STM32学习心得三十一:485通信原理及实验
- Unity 动态更改鼠标样式
- 电子元器件行业B2B交易系统:规范企业交易流程,提升销售管理效率
- 如何制作手机海报?手把手教你在线自制手机海报
- VMware Workstation Pro 16下载地址及key
- 最大熵模型怎么理解?熵是什么??
热门文章
- 十个不可不看的Matlab GUI
- MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结
- matlab——图像细化
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 11丨产品销售分析 II【难度简单】
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨字节面试真题【难度困难】
- html没有插件怎么办,html网页包插件没有插入options.title
- 人名和成绩一起排序_EXCEL基础知识——排序功能的使用
- 一文带你读懂计算机进制
- linux---基础02
- python实现常见排序算法