功能描述:Java前端设置一个结束时间,传给后端,后端使用crontab命令将所需要执行的命令写入,所需要执行的命令就是触发Jenkins job。
这样的目的:可以避免Java代码里面一直判断是否到了结束时间,将这个时间判断交给系统
前端代码如下:
有个文本框,用来输入结束时间,使用datetimepicker控件,这里遇到了该控件的两种写法,我用的是bootstrap提供的:http://www.bootcss.com/p/bootstrap-datetimepicker/demo.htm
官网用的“<i class="icon-th"></i>”这个可以出来那个日历图标,我特意看了一下源码,发现是一张图片
所以我的代码如下:
<div class="input-append date form_datetime">
<label>Ending Time</label>
<input id ='calendar' size="26" type="text" placeholder="Please select the endingtime" readonly>
<span class="add-on"><i class="icon-calendar"><img src="/files/calendar.png"/></i></span>
</div>
另一种写法参考这里,代码如下:http://eonasdan.github.io/bootstrap-datetimepicker/,可以使用glyphicon-calendar图标。
<div class='input-group date form_datetime col-sm-offset-5 col-sm-2'>
<input id ='calendar' type='text' class="form-control" placeholder="Please select the endingtime" readonly/>
<span class="input-group-addon">
<span class="glyphicon glyphicon-calendar"></span>
</span>
</div>
两种方法大家都可以试试,个人推荐第二种(虽然我用的第一种),这两种方式具体区别在哪里,我后面还会研究,研究出来会过来更新,这里暂时跳过。
顺便贴一下js代码:
var date=new Date();
$(".form_datetime").datetimepicker({
format: "yyyy-mm-dd hh:ii",
startDate:date,
autoclose: true
});
先直接上后端代码:
try {
String[] time=endingtime.split("-| |:");//将前端的时间分隔,开始按照crontab格式拼接命令
String deadline="";
for(int i=time.length-1;i>0;i--){
deadline+=time[i];
deadline+=" ";
}
deadline=deadline+"* ";
String cmds="(crontab -l;echo "+"\""+deadline+"curl -X POST 'http://Jenkins job的地址link/buildWithParameters?NAME1=*****(Jenkins job所需要的参数)&NAME2=*****' --user Lemon:Lemon0000\") |crontab";
//String cmds="(crontab -l;echo \"00 16 15 3 * curl -X POST 'http://*****/buildWithParameters?NAME1=****&NAME2=****' --user Lemon:Lemon0000\") |crontab";
//String[] command={"cmd", "/c", cmds}; //windows下的调用命令
String[] command={"/bin/sh","-c",cmds}; //linux 下的调用命令
Process ps = Runtime.getRuntime().exec(command);
ps.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
catch (Exception e) {
e.printStackTrace();
}
如果JavaWeb工程运行在Windows上,运行“String[] command={"cmd", "/c", cmds};”如果想要调用系统命令并且弹出窗口,运行“String [] cmd={"cmd","/C","start cmds"};”参考链接为:https://blog.csdn.net/toneylyx/article/details/52623597
我的工程是运行在Linux上的,所以使用"String[] command={"/bin/sh","-c",cmds};"注意:很多小伙伴的测试工程一般是在Windows上,实际运行的时候是在Linux上,这样要随时注意切换。
在Linux上运行完上述代码后,通过“crontab -l”即可查看对应的任务。
接下来重点说一下crontab命令:
1.首先使用“echo "53 14 13 3 * ./command" >> /etc/crontab”命令,提示我权限受限,需要root权限,但是我最终是通过Java来调用命令。所以所有需要root权限的都不可行。
2.当然“crontab -e”会弹出来一个编辑框就更不可取了
3.参考这个链接http://www.ttlsa.com/linux/use-scripts-add-crontab/,知道了在执行crontab -e命令时,会在/var/spool/cron目录下创建一个文件,文件的名称是你当前的用户名,于是我运行了“echo "53 14 13 3 * ./command" >> /var/spool/cron”,然而编辑这个/var/spool也需要root权限,虽然我们可以改一下文件的权限,但是我没胆儿改,所以此路不通。
4.通过请教大神发现可以这样写,不需要root权限:"echo "1 1 * * * /usr/sbin/ntpdate us.pool.ntp.org" | crontab" 然后开始测试触发Jenkins job的命令,采用curl -X POST
5.然后开始连在一起测试,发现我在Linux上直接输入“date”命令出来的时间和通过crontab命令打印的时间有时间差,通过命令“* * 14 3 * date >> /root/lemon/date.txt”将时间写入txt文件,然后查看,对比。发现是 timezone和localtime不一致,运行命令“cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime”然后重启crontab“service crond restart”解决,参考https://www.phpbulo.com/archives/171.html
6.继续测,发现echo "1 1 * * * /usr/sbin/ntpdate us.pool.ntp.org" | crontab 这条命令每次执行都会覆盖里面已经有的命令,修改命令为“(crontab -l; echo "1 1 * * * /usr/sbin/ntpdate us.pool.ntp.org") | crontab”
7.大功告成了,crontab的基本用法我这里就不赘述了,网上有蛮多的。
转载请注明出处,谢谢:https://blog.csdn.net/Blue___Ocean/article/details/79915773