定时任务概念:
为什么要使用Crond定时任务?
例如:我们数据库或者程序需要每天晚上0点做一次全备,定时同步时间服务器等等
Linux系统定时任务软件的种类:
at 适合仅执行一次就结束的调度命令,可以被crontab取代,
crontab 可以周期性的执行任务,需要开启crond服务在生产工作中最常用到的命令
anacron 主要用于非7*24小时开机的服务器,
提示:crond服务,crontab命令是生产工作中重要的命令应用,其他的很少使用,可以忽略
重点学习crondtab定时任务
指令语法:
usage: crontab [-u user] file
crontab [-u user] [ -e| -l | -r ]
(defaultoperation is replace, per 1003.2)
-e (edit user‘s crontab) 编辑用户命令
-l (list user‘s crontab) 列表
-r (delete user‘s crontab) 删除用户任务
-i (prompt before deleting user‘s crontab) 在删除前确认
-s (selinux context)
参数 | 含义 | 指定示例 |
-l | 查看crontab文件内容,提示:l为list的缩写 | crontab -l |
-e | 编辑crontab文件内容,提示:e可为edit 的缩写 | crontab -e |
-i | 删除crontab文件内容,删除前会提示确认,用得少 | crontab -ri |
-r | 删除crontab文件内容。用得很少 | crontab -r |
-u | 指定使用的用户执行任务 | crontab -u boy -l |
特别强调:-I –r参数在生产中很少用,没什么需求必须要用-e进去编辑即可 补充:crontab {-l|-e}实际上就是在操作/var/spool/cron/当前用户这样的文件 |
通过crontab可以在固定的时间执行指定的系统指令,时间单位可以是分钟、小时、日、月、周以及以上的任意组合,(日和周不要组合)
crond是一个服务,crontab是一个命令
crond服务通过crontab命令可以很容易的实现周期性的日志分析或数据备份等运维场景工作。
使用者权限及定时任务文件
文件 | 说明 |
/etc/cron.deny | 该文件中所列用户不允许使用crontab命令 |
/etc/cron.allow | 该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny |
/var/spool/cron/ | 所有用户crontab配置文件默认都存放在此目录,文件名以用户名命名 |
crontab -l 查看当前用户定时任务
调用/var/spool/cron/目录下相关用户的定时任务信息
[root@dingjian log]# cat /var/log/cron 查看定时任务日志
Crontab定时任务的书写格式
用户的定时任务一般分为6段(每段空格分隔,系统的定时任务则/etc/crontab分为7段),前五段为时间的设定段,第六段为所要执行的命令或脚本任务段
基本格式如下:
01 * * * * cmd
02 4 * * * cmd
22 4 * * 0 cmd
42 4 1 * * cmd
提示:
25pxd为要执行的命令或脚本,如/bin/sh /server/scripts/dingjian.sh
2.每个段之间必须要有空格
段 | 含义 | 取值范围 |
第一段 | 代表分钟 | 00-59 |
第二段 | 代表小时 | 00-23 |
第三段 | 代表日期 | 01-31 |
第四段 | 代表月份 | 01-12 |
第五段 | 代表时期 | 0-7(0和7都代表是星期日) |
提示:时间记忆口决:分时日月周
Crontab语法格式中特殊符号含义如表:
特殊符号 | 含义 |
* | *号,表示任意时间都,也是”每”的意思,举例:如00 23 * * *cmd表示每月每周每日的23:00都执行cmd任务 |
- | 减号,表示分隔符,表示一个时间段范围段,如17-19点,每小时的00分执行任务,00 17-19 * * * cmd 。就是17,18,19点整点分别执行的意思 |
, | 逗号,表示分隔时段的意思,30 17,18,19 * * * /bin.sh /scripts/dingjian.sh表示每天17,18和19点的半点时刻执行/scripts/dingjian.sh脚本。也可以和”-”结合使用,如:30 3-5,17-19 * * * /scripts/dingjian.sh |
/n | N代表数字,即”每隔n单位时间”,如:每10分钟执行一次任务可以写成 */10 * * * * cmd,其中“*/10”的范围是0-59,因此也可以写成0-59/10 |
chkconfig--list crond #列出开机自启动的crond项 [root@dingjian ~]# chkconfig --list crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off /etc/init.d/crondstatus #报告crond进程的状况 [root@dingjian ~]# /etc/init.d/crond status crond (pid 1091) isrunning... ps-ef |grep crond|grep -v grep #crond后台的工作情况并过滤出来 [root@dingjian ~]# ps -ef |grep crond|grep -v grep root 1091 1 0Nov19 ? 00:00:17 crond /etc/init.d/crondrestart #重启crond服务 [root@dingjian ~]# /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond: [ OK ]
定时任务范例:
范例1:每5分钟同步一次系统时间
echo ‘#time sync by dingjian at 2013-11-1‘>/var/spool/cron/root
echo ‘*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1‘ >>/var/spool/cron/root
或者 crontab –e然后把
#time sync by dingjian at 2013-11-1
*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1
加入到里面保存退出
生产环境crontab专业实例:
例1:每分钟打印一次自己的名字拼音全拼到”/server/log/自己的名字命名的文件”中。
解答:
方法1:crontab -e 输入以下内容
#pring a name by dingjian
* * * * * echo "dingjian" >>/service/log/dingjian
保存退出
[root@dingjian ~]# tail -f /service/log/dingjian
Mrxiong
用tail -f 命令跟踪文件内容
方法2:
* * * * * echo"huanweixiong-->> $(date+\%F" "\%T)" >>/service/log/dingjian
提示:在任务中,%前面一定要加转义\
如果不用转义,可以用另一种方法:
用脚本的方式:
[root@dingjianscripts]# echo "echo ‘blog.dingjian.me -->> $(date +%F""%T)‘>>/server/log/dingjian.log" >echo.sh [root@dingjian scripts]# cat echo.sh echo ‘blog.dingjian.me -->>2013-11-30 19:30:33‘>>/server/log/dingjian.log [root@dingjian scripts]# sh echo.sh [root@dingjian scripts]# cat/server/log/dingjian.log blog.dingjian.me -->> 2013-11-3019:28:38 blog.dingjian.me -->> 2013-11-3019:28:53 blog.dingjian.me -->> 2013-11-3019:28:53 blog.dingjian.me -->> 2013-11-3019:30:33
/var/log/cron 定时任务的日志目录
例2:每周六、日上午9:00和下午14:00来linux培训学习(/server/script/oldboy.sh)
答案:
#cron job for ett by oldboy 2010-12-12
00 9,14 * * 6,0 /server/script/oldboy.sh>/dev/null 2>&1
root用户查看tom用户的定时任务
crontab -u tom -l 查看tom定时任务
crontab -e tom -l 编辑tom定时任务
root下查看oldboy定时任务
crontab -u oldboy -l
root下编辑oldboy定时任务
crontab -u oldboy -e 编辑
定时任务的7个要领:
加必要注释,英文注释:如:什么人,什么时间,因为谁,做了什么事
如:#cron job for ett by dingjian 2010-12-12
00 9,14 * * 6,0 /bin/sh /server/script/dingjian.sh>/dev/null 2>&1
2.执行shell脚本任务前加/bin/sh
执行定时任务时,如果是执行脚本,在脚本前面带上/bin/sh命令 否则可能因忘了为脚本设定执行权限X,从而无法完成任务,所以凡是脚本任务,都要在前面加上/bin/sh
如:#cron job for ett by dingjian 2010-12-12
00 9,14 * * 6,0 /bin/sh/server/script/dingjian.sh >/dev/null 2>&1
不管s.sh有没有x权限,都可以执行脚本文件
3. 需要root权限执行的任务可以登陆到root用户下然后设置,如果不需要root权限,可以登陆到普通用户下(也可以直接在root下crontab -u oldboy -e 的写法直接设置),然后设置。这里要特别注意不同用户的环境变量问题,如果是调用了系统环境变量/etc/profile(如生产场 景中java程序的定时任务),最好在程序脚本中将用到的环境变量重新export下
平时工作中尽量多用crontab-e 和crontab -l 去编辑和查看定时任务,因为会有语法检查
如果给1000台服务器同时添加系统时间同步,可以使用分发工具或者批量运维脚本(脚本内容就是echo”脚本任务规则”>>/var/spool/cron/root)
4. 定时任务结尾加>/dev/null2>&1 如果追加指定日志文件里,就不要和/dev/null同时存在
/dev/null 定符设备,黑洞设备 2>&1指定是标准错误和标准输出一样 整个意思是把脚本的正常和错误输出都重定向到/dev/null.即不记录任何输出
如果定时任务结尾不加>/dev/null2>&1 很容易导致硬盘inode空间被占满,从而系统服务不正常
5.生产任务程序不要随意打印输出信息,
如:打包时去掉-v 不必要的输出就不要输出,如果一定要输出,也可以指定日志文件
[root@dingjian /]# tar zcf etc.tar.gz /etc>&/dev/null #输出到黑洞设备
[root@dingjian /]# tar zcvf etc.tar.gz /etc>&/tmp/tar.log #输出指定日志文件
6.定时任务命令或程序最好写到脚本里执行
如:* * * * *echo "Mrxiong-->> $(date+\%F" "\%T)" >>/service/log/Mrxiong
提示:在任务中,%前面一定要加转义\
如果不用转义,可以用另一种方法:
用脚本的方式:
[root@dingjian ~]# mkdir /server/scripts -p
[root@dingjian ~]# cd /server/scripts/
[root@dingjian scripts]# vi echo.sh
输入: echo "Mrxiong-->> $(date +%F" "%T)" >>/service/log/Mrxiong.log
[root@dingjian scripts]# crontab –e
加入
#pring a name by Mrxiong
* * * * * /bin/sh /server/scripts/echo.sh>/dev/null 2>&1
7.定时任务路径要用绝对路径,绝对路径就是从根开始的完整路径,当然也要确保路径对应的目录要存在才行,日志文件可以不存在
生产场景案例:
范例1:每隔1分钟,打印一个+号到dingjian.log,请给出crontab完整命令。
解答:
生成脚本:
[root@dingjian scripts]# echo ‘#!/bin/sh‘>>./echo.sh [root@dingjian scripts]# echo ‘echo +>>/tmp/dingjian.log‘ >>./echo.sh [root@dingjian scripts]# cat echo.sh #!/bin/sh echo + >>/tmp/dingjian.log
测试配置好的脚本:
[root@dingjian scripts]# sh echo.sh
[root@dingjian scripts]# sh echo.sh
[root@dingjian scripts]# sh echo.sh
[root@dingjian scripts]# cat/tmp/dingjian.log
+
+
+
+
配置定时任务:
[root@dingjian scripts]# echo ‘#print a"+" to /tmp/dingjian.log by dingjian 2013-11-28‘>>/var/spool/cron/root [root@dingjian scripts]# echo ‘*/1 * * * */bin/sh /server/scripts/echo.sh >/dev/null 2>&1‘>>/var/spool/cron/root [root@dingjian scripts]# crontab -l #查看定时任务例表 #print a "+" to /tmp/dingjian.logby dingjian 2013-11-28 */1 * * * * /bin/sh /server/scripts/echo.sh>/dev/null 2>&1
查看定时任务结果:
[root@dingjian scripts]# cat/tmp/dingjian.log
+
+
[root@dingjian scripts]# watch cat/tmp/dingjian.log
提示:watch 默认每两分钟查看后面的命令
如: watch cat /tmp/dingjian.log 查看文件
watch ls -l/tmp 查看目录
范例2:每隔2个小时,将/etc/services文件打包备份到/tmp下(最好每次备份成不同的备份包)
答:
#生成脚本:
[root@dingjian ~]# cd /server/scripts/
[root@dingjian scripts]# ll
total 4
-rw-r--r--. 1 root root 66 Nov 26 21:26tar.sh
[root@dingjian scripts]# vi tar.sh
在脚本中加入:
cd /etc/
tar zcf /tmp/service_$(date+%Y%m%d%H%M).tar.gz ./services
[root@dingjian scripts]# rm /tmp/* -rf
#测试脚本能不能运行
[root@dingjian scripts]# sh tar.sh
[root@dingjian scripts]# ls -l /tmp
total 128
-rw-r--r--. 1 root root 127319 Nov 27 00:29service_2013112700.tar.gz
#配置定时任务:
[root@dingjian scripts]# crontab -e
把以下内容加入:
####注释
00 */2 * * * /bin/sh /server/scripts/tar.sh>/dev/null 2>&1
保存退出
提示:所以一般建议打包某一文件, 要到这个文件的上一层目录打包,不要从根目录打包,不然一解压会把根覆盖了如:打包/etc/services.就进到/etc/目录来打包services,
[root@dingjian scripts]# sh tar.sh& 加个&表示在后台运行这个脚本
范例3:每天晚上12点,打包站点目录/var/www/html备份到/data目录下(最好每次备份按时间生成不同的备份包)
解答:
[root@dingjian scripts]# mkdir/var/www/html -p #创建测试环境 [root@dingjian scripts]# mkdir /data [root@dingjian scripts]# date +%F #命令测试 2013-11-27 [root@dingjian scripts]# cd /var/www/ [root@dingjian www]# tar zcf/data/data_$(date +%F).tar.gz ./html #注意打包要到要复制的[root@dingjian www]# ls -l /data 文件的上一层目录打包 total 4 -rw-r--r--. 1 root root 111 Nov 27 01:13data_2013-11-27.tar.gz [root@dingjian www]# cd /server/scripts/ #将测试号的脚本放入到脚本测试 [root@dingjian scripts]# rm /data/* -rf [root@dingjian scripts]# ls /data [root@dingjian scripts]# vi tarhtml.sh #创建脚本 cd /var/www/ tar zcf /data/data_$(date +%F).tar.gz./html [root@dingjian scripts]# sh/server/scripts/tarhtml.sh #执行全路径测试脚本 [root@dingjian scripts]# ls /data data_2013-11-27.tar.gz [root@dingjian scripts]# crontab -e #编辑定时任务,注意规范书写 #tar /var/www/html everyday by dingjian2013-11-27 00 00 * * * /bin/sh/server/scripts/tarhtml.sh >/dev/null 2>&1 [root@dingjian scripts]# crontab -l #查看编辑的结果 #tar /var/www/html everyday by dingjian2013-11-27 00 00 * * * /bin/sh/server/scripts/tarhtml.sh >/dev/null 2>&1
特殊的调试
范例4:每周六、日上午9:00和下午14:00来顶尖上课(执行程序/server/scripts/dingjian.sh代替学习)
解答:
#study form dingjian at 9:00 and 14:00 onsat and su
00 9,14 * * 6,0 /bin/sh/server/scripts/dingjian.sh >/dev/null 2>&1
生产场景如何调试crontab定时任务
1.增加执行频率调试任务
调试时,把任务执行频率调快一点,如:每分钟、每5分钟执行一次,或者比当前时间推迟5分钟以后,看能否执行,如果正常没问题了,再改成需要的任务的执行时间。
强调:有些任务是不允许频繁执行的,如:定时往数据库里插入数据,这样的任务就要在测试机上测试好,然后正式线上出问题的机会就少了。
规范的公司开发和运维人员的操作流程:个人的开发配置环境--à办公室的测试环境-àidc机房的测试环境-àidc机房的正式环境
2. 调整系统时间调试任务
用正确的执行任务的时间,设置完成后,可以修改下系统当前时间,改成任务执行时间的前五分钟来测试(或者重启定时任务服务)。如:定时任务9:00执行,我们可以把系统时间改成8:55分,然后观察是不是正确执行。如果是生产环境服务器不要这样处理,测试环境可以使用这个手段
3.通过日志输出调试定时任务
在脚本中加入日志输入,然后把输出到指定的日志中,然后观察日志内容结果,看是否执行或正确执行,或把脚本结果定向到一个log文件里,重定向〉即可,不要用>>追加,这样晶习就不会一直变大
如:定时任务中加输出
#study task bydingjian at 20131129
00 9,4 * * 6,0/bin/sh /server/scripts/dingjian.sh >/tmp/log.log 2>&1
脚本中加输出
[root@dingjian scripts]# cat tar.sh #!/bin/sh cd / tar zcvf /tmp/etc_$(date +%Y%m%d%H).tar.gz./etc >/tmp/tmp.log 2>&1
4.注意一些任务命令带来的问题
*/ 1 * * * * echo “==” >>/tmp/dingjian.log>/dev/null 2>&1 这是隐蔽的无法正确执行的任务配置,原因是前面多了个>> ,或者去掉结尾的>/dev/null 2>&1
强调:此问题是因为前面己有了重定向,后面要去掉>/dev/null 2>&1
5. 在调试java程序任务的时候,注意环境变量,把环境变量的定义加到脚本里。
例:
#!/bin/sh
export JAVA_HOME=/application/jdk1.6
export PATH=$JAVA_HOME/bin:$PATH
export SH_HOME=/application/resin/webapps/ROOT/
export LIB=$SH_HOME/WEB-INF/lib
..省略部分...
定时任务
00 9,14 * * * nohup/scripts/resin/shell/Task.sh & >/app/log.log 2>&1
6.通过定时任务日志调试定时任务
查看定时任务服务日志
[root@dingjian scripts]# tail -f/var/log/cron Nov 29 01:39:01 dingjian CROND[8557]:(root) CMD (/bin/sh /server/scripts/echo.sh >/dev/null 2>&1) Nov 29 01:40:01 dingjian CROND[8566]:(root) CMD (echo "==" >>/tmp/dingjian1.log >/dev/null2>&1) Nov 29 01:40:01 dingjian CROND[8567]:(root) CMD (/usr/lib64/sa/sa1 1 1) Nov 29 01:40:01 dingjian CROND[8568]:(root) CMD (/bin/sh /server/scripts/echo.sh >/dev/null 2>&1)
Crontab生产问题案例及解决过程
No space left on device故障
面试题:维护的时候,创建文件提示”No space left on device”,请问你这是什么故障:
解答:磁盘空间block满了或者inode被占满了
故障描述及说明:
某年某月甘日某时,某人在工作中设置crontab定时任务规则保存时,提示” No space left on device”,此时用df -h检查磁盘,发现还有剩余空间,用df -I 检查则显示/var目录己占用100%的inode数量,看来是inode数量耗尽,导致系统无法在/var目录下创建文件,因为定时任务的配置在/var/spool/cron下,ext3文件系统中,每个文件需要占一个inode,
No space left on device 故障解决办法:
最后经过检查发现在/var/spool/clientmqueue/下有超多的文件,执行ls/var/spool/clientmqueue命令查看,很长时间没能显示出结果,执行cd /var/spool/clientmqueue;rm –f *会自动跳出来,也是无法删除,最后只能通过xargs命令来配合解决,清理实际命令为:cd /var/spool/clientmqueue&&ls|xargs rm –f
在清理时,如果数量特别多的时候,执行ls|xargs rm –f 命令也会长时间无反应,那是命令在处理中,当然我们也可以使用更快的删除方法,如直接使用cd /var/spool&&rm –rf clientmqueue,删除上级目录,然后执行
mkdirclientmqueue&&chmod 770 clientmqueue&&chown smmsp.smmsp -R/var/spool/clientmqueue
修改回/var/spool/clientmqueue目录在系统中的原来默认权限
[root@dingjian scripts]# ls -ld/var/spool/clientmqueue/
drwxrwx---. 2 smmsp smmsp 4096 Nov 26 15:41/var/spool/clientmqueue/
故障原因分析:
当系统中crond定时任务执行程序有输出内容时,输出内容会以邮件形式发给crond的用户(默认是root),而sendmail等mail服务没有启动时,这些输出内容以为支在邮件队列临时目录,产生这些碎文件,导致消耗inode数量,一旦inode数量耗尽,就会导致系统无法写入文件,而报上述错误:No space left on device.
亡羊补牢解决方法:
尽量将crontab里面的命令或脚本中的命令结尾加上>/dev/null 2>&1,或在做定时执行脚本时,把屏幕输出定向到指定文件里
当然也可以开启邮件服务,不过最好不做,因为邮件服务会带来安全问题
优化系统,加定时清理任务,如find /var/spool/clientmqueue/ -type f -mtime +30|xargs rm -f
Crontab定时任务生产应用问题8箴言
1.export变量问题
crontab执行shell时只能识别为数不多的系统环境变量,一般用户定义的普通变量是无法识别的,如果在编写的脚本中需要使用这些变量,最好使用export重新声明下该变量,脚本才能正常执行,如:生产情况和java相关的服务任务和脚本
2.任务路径问题:
Crontab执行shell时,一定要用绝对路径
3. 脚本权限问题
要确保crontab的执行者有访问shell脚本所在目录并且执行此shell脚本的权限(可用chmod和chown修改脚本权限和所有者)。当然,最佳方法是执行脚本前加/bin/sh执行测试下,在配置任务执行脚本时,可以省略当前用户配置,但最好带上/bin/sh.否则有可能因为忘了为脚本设定执行权限,而无法完成任务
范例:
* * * * */server/scripts/tar.sh #此时如果tar.sh没有可执行权限,就无法执行了
要在带上/bin/sh
* * * * */bin/sh /server/scripts/tar.sh
4.时间变量问题
%号在crontab任务中被认为是newline.需要用\来转义,crontab任务命令中,如果有”dat+%Y%m%d”,必须替换为: ”dat+\%Y\%m\%d”,但写脚本中就不需要了,
范例:
#tar commend by dingjian at 2013-11
*/1* * * * /cd /etc/&&tar zcvf /tmp/service_$(date+\%Y\%m\%d\%H\%M).tar.gz ./services
脚本实现方法:
配置脚本:
echo ‘cd /etc/&&tar zcvf/tmp/service_$(date +%Y%m%d%H%M).tar.gz ./services‘>./tar.sh
配置定时任务
[root@dingjian scripts]# echo ‘#tar/etc/services by dingjian at 2013-11-29‘ >>/var/spool/cron/root [root@dingjian scripts]# echo ‘*/1 * * * */bin/sh /server/scripts/tar.sh >/dev/null 2>&1‘>>/var/spool/cron/root [root@dingjian scripts]# crontab -l #tar /etc/services by dingjian at 2013-11-29 */1 * * * * /bin/sh /server/scripts/tar.sh>/dev/null 2>&1
5.>/dev/nul 2>&1 问题
当定时任务在你所指定的时间执行后,系统会寄一封信给你,显示该程式执行的内容,若系统未开启邮件服务就会导致邮件临时目录/var/spool/clientmqueue碎文件逐渐增多,以至于大量消耗inode数量,其实可以在每一行任务结尾空一行之后加上>/dev/nul 2>&1将输出定向为空来规避这个问题
如果需要打印日志输出,也可以追加到指定的日志文件里,尽量不要留空。如果任务本身是命令的话,添加>/dev/nul 2>&1时要慎重,需多测试并且有检查手段。如:*/1* * * *echo”==”>> /tmp/dingjian.log >/dev/nul 2>&1,该任务规则就是无法执行的。
说明:/dev/null为特殊设备,表示黑洞设备或空设备。2>&1表示让标准错误或标准输出一样都定向到空设备,本命令内容就是把脚本的输出重定向到/dev/null,即不记录任务输出,也不给充管理员发邮件
6.定时任务加注释
加必要注释,英文注释: 如:什么人,什么时间,因为谁,做了什么事
如:#cron jobfor ett by dingjian 2010-12-12
00 9,14 * * 6,0 /bin/sh /server/script/dingjian.sh>/dev/null 2>&1
7.使用脚本程序替代命令
使用脚本执行任务可以让我们少范错误,提升效率、规范定时任务中执行命令,定时任务中执行命令有一些限制,如时间变量问题,多个重定向命令混用问题等
8.避免不必要的程序输出
在开发定时任务程序或脚本时,在调试好脚本程序后,应尽量把DEBUG及命令输出的内容信息屏蔽掉,如果不需要,可以定向到指定日志文件里,以免产生多余的系统垃圾
如:平时打包喜欢tarzcvf 这个-v参数就是查看打包信息的,做成定时任务就不要输出了。
范例:
*/1 * * * * cd/etc/&&tar zcvf /tmp/service.tar.gz ./services 这里的v参数就不必要的
crond export变量问题生产案例
范例:
我写了一个重启resin的脚本,由于业务原因,需要定时在某一个时间重启下resin服务器,于是就在
crontab里配置了如下内容
50 17 * * * 1-5 root/usr/local/bin/resin_restart.sh
其中,resin_restart.sh内容如下:
#!/bin/sh
/usr/local/bin/xxresin_stop.sh
/usr/local/bin/xxresin_start.sh
问题来了,服务器虽然定时起来了,但是却报如下错误:
Resin can`t load com.sun.tools.javac.Main.Usually this means that the JDK tools.jar is missing from the classpath
Possibly because of using a JRE instead of the JDK.
Youcan either add tools, jar to the classpath or change the compiler to anexternal one with <java compiler=’javac’/> or jikes.
但是,明明己在profile里配置了环境变量,为啥还找不到呢,
故障解决:
由于export变量问题导致:具体为,crontab执行shell时只能识别为数不多的系统环境变量,
普通环境变量一般是无法识别的,如果在编写的脚本中需要使用变量,最好使用export重新声时下该变量
然后在resin重启脚本里重新定义了下环境变量,脚本如下:
#!/bin/sh
JAVA_HOME=”/opt/jdk1.6.0_18”
CLASSPATH=$JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar;/opt/nginx-0.7.61/sbin;/jdk1.6.0_18/bin;/opt/resin-3.0.25/bin;$PATH
export JAVA_HOME PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRCCLASSPATH
/usr/local/bin/xxresin_stop.sh
/usr/local/bin/xxresin_start.sh
本文出自 “Mr.Xiong`s 运维日志” 博客,请务必保留此出处http://mrxiong2017.blog.51cto.com/12559394/1924123
原文地址:http://mrxiong2017.blog.51cto.com/12559394/1924123