ubuntu设置定时任务的三种方法

2020-09-02 10:19:09 浏览数 (1)

老子曰:天道轮回。谁,都是一个定时的轮回

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---


0 人点赞