linux下开机自动启动,定时运行shell脚本

Shell 脚本与window/dos 下的批处理类似,也就是用各种命令预先放入一个文件中,方便一次性执行的的一个程序文件,主要是方便管理员进行设置或者管理用。

1、shell脚本java

在Linux下,咱们执行一个命令,执行结果通常会输出在命令行下。如咱们想要将执行命令的结果,输出在文件下的时候咱们可使用输出重定向
“>” 定向输出到目标文件,若是文件不存在则建立文件,若是文件存在则清空其内容。
“>>” 定向输出到目标文件,若是文件不存在则建立文件,若是文件存在则在其内容后进行追加。
例如 ls >> /root/myword/result.txt 将ls命令执行的结果,存放在/root/myword/1.txt文件下面。
这里写图片描述

当咱们须要执行两个命令的时候,能够在两个命令之间加上一个&&字符
例如 ls && ll 这样就能顺序地执行的两个命令了。
这里写图片描述

可是,在咱们执行多个命令的时候,就再也不适用了。
因此咱们能够用shell脚原本执行多个命令。咱们能够建立一个shell脚本,在文件直接写上多个命令,退出保存,直接运行就能够运行在sh文件里面的多个命令了。
这里写图片描述
这里写图片描述
这里写图片描述

web

2、后台运行shell脚本,并在开机自动启动shell

想要在后台不挂断式地运行shell脚本,咱们可使用nohup(no hang up,不挂运行)命令。
nohup commend >> dir &
commend - 想要运行的命令
“>>”或“>” - 输出重定向,即将执行的结果从新定向输出到指定文件。
dir - 输出重定向的路径
& - 在后台运行
例如,nohup ./test.sh >> /root/test.txt &
在本目录下面,后台运行test.sh脚本,并将直接结果从新定向输出到 /root/test.txt文件中。

那么,如何让它开机自动启动呢?
咱们能够配置一下/etc/rc.d/rc.local文件(自启动服务)来实现它。
输入 vi /etc/rc.d/rc.local 进rc.local文件,
输入想要开机启动的命令就好了,从新启动一下,就能够看到在test.txt有执行的结果的输出了。
例如,输入nohup ./test.sh >> /root/test.txt &
这里写图片描述

3、定时运行shell脚本
定时运行一个命令,咱们可使用crontab命令,crontab命令用于设置周期性被执行的指令。
crontab -e编辑任务
crontab -l显示目前全部的任务
crontab -r删除全部的任务
咱们能够输入 crontab -e 进入编辑,输入想要周期性运行的命令就能够了。
时程表的格式以下:
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其他类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其他类推
当 f1 为 /n 时表示每 n 分钟个时间间隔执行一次,f2 为 /n 表示每 n 小时个时间间隔执行一次,其他类推
当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其他类推
例如: */1 * * * /root/test/test.sh 就是每一分钟运行一次/root/test/test.sh命令 (注意空格!)centos



4、咱们如今来写一个,开机自动启动,在后天运行,每分钟执行一次输出时间的例子。bash

(一)先编写一个java程序,来获取当时的时间,而且输出在指定文件中。svg

[root@VM_15_248_centos myword]# vi Hellow.java

import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.PrintWriter;
import java.io.IOException;

/** * Description: * 获取/root/myword/1.txt文件的输出流,输出当时的时间。 * * @author Lee */
public class Hellow{

        public static void main(String[] args){
                try{
                        //获取输出流,并将其包装成PrintWriter类
                        FileOutputStream output = new FileOutputStream("/root/myword/1.txt");
                        PrintWriter print = new PrintWriter(output);

                        //获取当时的时间
                        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        String date = s.format(new Date());

                        //输出
                        print.println(date);
                        print.flush();
                }catch(IOException e){
                        e.printStackTrace();
                }
        }
}

编译运行它,查看是否成功运行,运行成功。
这里写图片描述

spa

(二)编写一个shell脚原本运行它
因为,用到一些类,因此咱们要导入java的环境变量,来运行它。(关于java环境变量的配置能够查看我另一篇博客)命令行

JAVA_HOME=/data/home/server/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=$CLASSPATH:.:${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib
export PATH=${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:$PATH

java -cp /root/myword Hellow

这里写图片描述
运行一下脚本,查看是否成功,能够看到成功输出了。
这里写图片描述
这里,也有可能运行不了shell脚本,咱们输入 chmod u+x f.sh 来修改权限。
这里写图片描述

3d

(三)配置/etc/rc.d/rc.local文件(自启动服务),及crontab命令
输入vi /etc/rc.d/rc.local
在配置文件中输入 nohup /root/myword/f.sh &
这里写图片描述
保存,退出。
输入 crontab -e
在配置文件中输入 */1 * * * * /root/myword/f.sh
这里写图片描述
保存,退出以后,就能够看到。
这里写图片描述

咱们就能够看到每分钟,shell脚本在后台执行java程序,输出当时的时间在 /root/myword/1.txt 文件当中。
这里写图片描述code