大家好,关于服务器定时任务很多朋友都还不太明白,今天小编就来为大家分享关于常开的服务器上定时定点设置启动关闭某个软件的知识,希望对各位有所帮助!
一、如何用Spring实现集群环境下的定时任务
定时任务的实现方式有多种,例如JDK自带的Timer+TimerTask方式,Spring 3.0以后的调度任务(Scheduled Task),Quartz等。
Timer+TimerTask是最基本的解决方案,但是比较远古了,这里不再讨论。Spring自带的Scheduled
Task是一个轻量级的定时任务调度器,支持固定时间(支持cron表达式)和固定时间间隔调度任务,支持线程池管理。以上两种方式有一个共同的缺点,那就是应用服务器集群下会出现任务多次被调度执行的情况,因为集群的节点之间是不会共享任务信息的,每个节点上的任务都会按时执行。Quartz是一个功能完善的任务调度框架,特别牛叉的是它支持集群环境下的任务调度,当然代价也很大,需要将任务调度状态序列化到数据库。Quartz框架需要10多张表协同,配置繁多,令人望而却步...
经过折中考虑,还是选择了Spring的Scheduled Task来实现定时任务。如下:
1. Spring配置文件lication-context.xml中添加task命名空间和描述。
[html] view plain copy
<beans xmlns=""
xmlns:task=""
xsi:schemaLocation="
">
2.添加调度器和线程池*。
[html] view plain copy
<task:executor id="taskExecutor" pool-size="10"/>
<task:annotation-driven executor="taskExecutor"/>
3.实现调度方法。基本结构如下:
[html] view plain copy
package .ease.yx.service;
import .springframework.scheduling.annotation.Scheduled;
import .springframework.stereotype.Service;
@Service
public class ScheduledService{
@Scheduled(cron="0 0 5***")
public void build(){
System.out.println("Scheduled Task");
}
}
@Scheduled注解支持秒级的cron表达式,上述*表示每天5点执行build任务。
前文已经提过,这种方式在单台应用服务器上运行没有问题,但是在集群环境下,会造成build任务在5点的时候运行多次,遗憾的是,Scheduled Task在框架层面没有相应的解决方案,只能靠程序员在应用级别进行控制。
如何控制?
1.无非是一个任务互斥访问的问题,*一把全局的“锁”作为互斥量,哪个应用服务器拿到这把“锁”,就有执行任务的权利,未拿到“锁”的应用服务器不进行任何任务相关的操作。
2.这把“锁”最好还能在下次任务执行时间点前失效。
在项目中我将这个互斥量放在了redis缓存里,1小时过期,这个过期时间是由任务调度的间隔时间决定的,只要小于两次任务执行时间差,大于集群间应用服务器的时间差即可。
完整定时任务类如下:
[html] view plain copy
package .ease.yx.service;
import j*ax.annotation.Resource;
import .apache.mons.lang3.time.DateUtils;
import .springframework.scheduling.annotation.Scheduled;
import .springframework.stereotype.Service;
import .ease.yx.service.ICacheService;
@Service
public class ScheduledService{
@Resource
private ICacheService cache= null;
private static String CACHE_LOCK="cache_lock";
private static int EXPIRE_PERIOD=(int)DateUtils.MILLIS_PER_HOUR/ 1000;
@Scheduled(cron="0 0 5***")
public void build(){
if(cache.get(CACHE_LOCK)== null){
cache.set(CACHE_LOCK, true, EXPIRE_PERIOD);
doJob();
}
}
}
二、如何让windows将大量文件自动定时备份至linux服务器
这样吧!
1.你在windows上装备FlashFXP这个软件!然后定制一个传送列队,把列队可以存出来,在软件中把是否覆盖这类东西设好,然后双击那个列队文件,就开始上传了!然后再windows计划任务里把这个列队文件设成计划任务!
2.或者你可以在linux上开SMB服务,就是把linux的一个区域模拟成windows的共享,这样你就可以简单的用复制粘贴等操作把你文件copy到linux上去了(做个.bat的批处理文件拷贝也可以,这样bat文件就可以放到计划任务里了),把共享做个映射的硬盘;
2.1用Allway Sync备份工具 V9.2.11汉化版这个软件去同步两边的文件,
2.2当然你也可以用fastcopy这个软件,自动复制指定文件夹所有文件,对方如果同名文件存在,可以根据修改日期自动判断是否覆盖!淡然执行那个按钮你得点,不过这个问题可以用按键精灵解决,让按键精灵设定好时间,定时启动替你干这个!
当然高级办法也有,有人用VBS脚本来干,不过我不熟那个,所以没用,但网上能找到!
3.在linux系统上设置crontab,晚上定时去windows ftp上。借鉴楼下的做了点说明
3.1在windows上安装ftp服务端
3.2在写脚本auto_download.sh:
参考:
lftp 10.0.0.1-u user,passwd-e'cd/pwd;get XX;quit'
多文件请用mget
3.3在linux上设定crontab
crontab-e
00 00*** sh/pwd/auto_download.sh
每天零点开始执行auto_download.sh这个脚本
呵呵,这么多思路你慢慢想吧!总有好办法的!祝你好运
三、怎么设置服务器定时重启
通过系统自带的计划任务来实现,操作步骤如下:
打开开始,程序,附件,系统工具中任务计划,弹出任务计划窗口;然后双击添加任务计划;运行任务计划向导,浏览;找到c盘下系统目录中的计划任务文件,单击打开按钮;在出现的对话框中键入该任务的名字,执行方式选择每周,然后下一步选择定时关机时间;下一步选中当单击完成打开该任务的高级属*,单击完成即可。
四、常开的服务器上定时定点设置启动关闭某个软件
定时开启程序操作:
首先:依次打开控制面板-管理工具-服务-Task Scheduler,启动。
其次:还是在控制面板里打开计划任务,添加任务计划,双击-下一步-浏览-选定要操作的程序-每天-下面的自己弄自己设
结果:到对应的时间段自动开启程序。
定时关闭程序操作:
首先:在桌面上创建个文本文档,在里面输入
ntsd-c q-pn qq.exe(应用程序自定)
改后缀为.bat如(1.bat)
其次:在控制面板里打开计划任务,添加任务计划,双击-下一步-浏览-选定刚刚创建的1.bat文件-每天-下面的自己弄自己设
结果:到对应时间段自动关闭相应程序。
五、关于crontab定时任务报错问题
localhost crond:/usr/sbin/sendmail: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
最近发现服务器没有校时,设置定时任务后服务器日志打印libmysqlclient.so.18没有找到错误。百度查的千篇一律,都是让ln-s/usr/local/mysql/lib/libmysqlclient.so.18/usr/lib做软连接。开始照着百度的做,一直没办法解决。
后来查看/var/log/messages,发现服务器启动时就有postmail报错。然后在测试服务器上yum安装postfix时发现依赖了mariadb-lib的包,回想起当初装MySQL时卸载了mariadb所有的rpm包;至此问题根源找到了。
在现场环境中卸载postfix,然后yum-y install postfix重新安装,find/-name libmysqlclient*:
/usr/lib64/mysql/libmysqlclient.so.18
/usr/lib64/mysql/libmysqlclient.so.18.0.0
文件已经可以找到。而且比较坑的是搜索所有的文章都是说在/usr/lib上,实际中我用的是Centos7的64位版本,位置也不一样,看来找问题还是不能尽信别人。
以后有时间尝试把mariadb-lib包卸载后,软连接建到/usr/lib64/mysql/目录下。看看还有没有错误
PS:建软连接已经尝试过,不可行。
现场如果有MySQL怕影响业务,可以在crontab定时任务后面加 &>/dev/null就不会调用sendmail了