“ 老子曰:天道轮回。谁,都是一个定时的轮回”
01
—
corn
cron,是一个Linux定时执行工具,可以在无需人工干预的情况下运行作业。
1、添加定时任务
推荐使用crontab -e命令添加自定义的任务
参数说明
m h dom mon dow command
m 分钟 0-59
h 小时 0-23
dow 天1-31
mon 月 1-12
dow 星期 1-6 0表示星期天
command 就是要执行的命令
除了这些固定值外,还可以配合星号(*),逗号(,),和斜线(/)来表示一些其他的含义:
- 星号 表示任意值,比如在小时部分填写 * 代表任意小时(每小时)
- 逗号 可以允许在一个部分中填写多个值,比如在分钟部分填写 1,3 表示一分钟或三分钟
- 斜线 一般配合 * 使用,代表每隔多长时间,比如在小时部分填写 */2 代表每隔两分钟。所以 */1 和 * 没有区别
1. * * * * * date >> /home/postgres/time.log # 每隔一分钟执行一次任务
2. 0 * * * * date >> /home/postgres/time.log # 每小时的0点执行一次任务,比如6:00,10:00
3. 6,10 * 2 * * date >> /home/postgres/time.log # 每个月2号,每小时的6分和10分执行一次任务
4. */3,*/5 * * * * date >> /home/postgres/time.log # 每隔3分钟或5分钟执行一次任务,比如10:03,10:05,10:06
2、重启cron服务
代码语言:javascript复制service cron restart
02
—
nohup命令
编写java程序,编写一个主函数,在主函数里边写入一下代码
代码语言:javascript复制 public static void main(String[] args) throws Exception {
// 一天的毫秒数
long daySpan = 24 * 60 * 60 * 1000;
// 规定的每天时间15:33:30运行
// final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 15:33:30");
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 02:00:00");
// 首次运行时间
Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
// 如果今天的已经过了 首次运行时间就改为明天
if (System.currentTimeMillis() > startTime.getTime()) {
startTime = new Date(startTime.getTime() daySpan);
}
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
long initialDelay=1000L;
long period = 100L;
executorService.scheduleAtFixedRate(() -> {
//do something
//delay--这是以毫秒为单位的延迟之前的任务执行。
//period--这是在连续执行任务之间的毫秒的时间
},initialDelay,period, TimeUnit.HOURS);
}
生成jar包,并上传到服务器的某路径
执行如下命令
代码语言:javascript复制java -jar XXX.jar &
当前窗口不被锁定,输出的日志会显示在屏幕上,当关闭窗口的时候,停止执行。
nohup 不挂断运行的命令,当终端或者账户关闭的时候,程序依旧运行。
当前的命令默认会把日志输出到nohup.out文件中,执行如下命令
代码语言:javascript复制nohup java -jar XXX.jar &
指定输出文件,执行如下命令
代码语言:javascript复制nohup java -jar XXX.jar >log.out &
查看后台启动命令是
代码语言:javascript复制jobs
但是它只能查看当前连接中断的后台命令,当关闭终端再次打开的时候可以执行如下命令查看
代码语言:javascript复制ps -ef
03
—
screen
还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:
1、安装命令
代码语言:javascript复制apt-get install screen
2、常用命令
创建screen会话
代码语言:javascript复制screen java -jar start.jar
或者
代码语言:javascript复制screen
离开screen,但是保留里面的程序操作是
Ctrl a d
恢复会话
先查看当前screen里的会话 screen -ls
screen -r (进程名或进程号) :实际执行命令时是没有括号的,这里只是为了说明
关闭会话
Ctrl c或者exit
常用快捷键
Ctrl a c :在当前screen会话中创建窗口
Ctrl a w :窗口列表
Ctrl a n :下一个窗口
Ctrl a p :上一个窗口
Ctrl a 0-9 :在第0个窗口和第9个窗口之间切换
screen启动会话时如果是直接执行 screen java -jar start.jar 会有两个进程在跑,解决办法是
先执行screen,在会话窗口里面再执行你要的程序或任务
文/戴先生@2017年10月11日
---end---