.sh 定时启动脚本 启动jar文件

进入.sh文件目录下,执行sh命令

 #检查脚本是否有问题

sh -x start.sh

启动命令:sh start.sh start
停止命令:sh start.sh stop
查看状态命令:sh start.sh status
重启命令:sh start.sh restart

常见错误:

1、$‘ \r’:未找到命令

错误原因:win 文件和linux文件不兼容

解决方法,用notepad++ 打开.sh文件,在右下角,将Windows改成unix

在这里插入图片描述

2、提示没有权限

问题原因:.sh 是可执行文件,受保护,需要可执行权限
解决方法:执行命令 chmod +x start.sh

 执行命令是 ./start.sh 就是 ./ 加上你想执行的shell脚本

 

crontab  -e   (进入定时任务编辑界面,默认为VI编辑器,编辑器可配置。在此顺带说两句VI编辑器的使用,简单来说,进入编辑,可以用以下两个命令直接编辑

A:当前行的尾部追加内容    i:游标前插入内容  l:游标后插入内容)

如果你之前没有过定时任务的话,那么crontab -e进去之后直接就是空白。然后就进行添加就行了,添加格式如下:

基本格式 :

*  *  *  *  *  command

分 时   日  月 周   命令

第一个星号所在的列表示分钟,范围为1~59,*表示范围内的所有值,即全选,*/1  表示每一分钟,同样,*/5表示整点开始,每5分钟。

第二个星号所在的列表示小时,范围1~23(0表示0点)。同样适用于*/1 表示每小时。

第三个星号所在的列表示日期,范围1~31。

第四个星号所在的列表示月份,范围1~12.

第五个星号所在的列表示周,范围0~6 (0表示周日)。

第六个星号所在的列表示命令,即你想要执行的命令。

(额外说一下VI的保存命令,在填写完成你要定时执行的任务后,用:wq或者:x保存退出,:wq表示强制保存退出,:x表示有更改时才会保存退出,没有直接退出,二者设计版本号的更新问题,在此不细说。)

 

下面具体给出几个crontab运用时间的例子

*/1 * * * * /home/manager/start.sh

表示每一分钟执行一次,在路径/home/manager/下的ps.sh文件

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

表示每月1、10、22日的4 : 45重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart

表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

每月的4号与每周一到周三的11点重启apache

因为我是要用linux的定时任务定时执行.jar文件,所以就以此详细说一下。

首先我的crontab命令很简单 13 * * * *  /home/RealDataPublish.sh 即每小时的13分钟执行以下RealDataPublish.sh这个文件。

最后说一下,定时器执行一次任务,每次都会有回执邮件,在/var/spool/mail/root 下 (如果你是root用户登录的话)

常用的命令:

crontab -l   查看所有正在运行的所有crontab命令

crontab -r : 删除目前的时程表

crontab file [-u user]-用指定的文件替代目前的crontab

ps –ef|grep crontab 查看crontab是否已经启动

如果没有启动则运行service crond start 即可启动。(如果提示Redirecting to /bin/systemctl start  crond.service,则是因为版本的问题导致,可以使

用/bin/systemctl start  crond.service进行启动)

 

**crontab文件的含义:**用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute hour day month week command 顺序:分 时 日 月 周

其中:

minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

 

1. 创建shell脚本文件:使用文本编辑器创建一个新的shell脚本文件,例如`myscript.sh`,并在其中编写要定时执行的任务逻辑。

2. 给脚本文件添加执行权限:使用`chmod +x myscript.sh`命令给脚本文件添加执行权限,确保它可以被执行。

3. 设置crontab定时任务:使用`crontab -e`命令编辑当前用户的crontab文件。

4. 添加定时任务配置:在crontab文件中,每行表示一个定时任务。以每天定时运行为例,你可以添加类似以下的配置:

```shell
0 0 * * * /path/to/myscript.sh
```

上述配置表示在每天的午夜零点执行`/path/to/myscript.sh`脚本。你可以根据需求调整执行时间,详细的crontab时间设置可以参考Cron语法。

5. 保存并退出crontab编辑器:保存修改并退出crontab编辑器。


crond服务

/sbin/service crond start # 启动服务
/sbin/service crond stop # 关闭服务
/sbin/service crond restart # 重启服务
/sbin/service crond reload # 重新载入配置

查看crontab服务状态:

systemctl status crond

手动启动crontab服务:

systemctl start crond

查看crontab服务是否已设置为开机启动,执行命令:

ntsysv

加入开机自动启动:

chkconfig –level 35 crond on

chkconfig crond on

 

解释:

`chkconfig crond on`命令的作用是将`crond`服务添加到开机启动项中,在系统启动时自动启动。而`chkconfig –level 35 crond on`命令则是将`crond`服务添加到运行级别为3和5的开机启动项中,同样在系统启动时自动启动。

在Linux系统中,运行级别指的是系统运行的不同状态,例如用户界面和命令行界面。Linux系统有7个运行级别(编号0~6),其中6表示系统重启。一般来说,用户都是在运行级别3或5下使用Linux系统,因为这两个级别下都包括了完整的网络和用户界面。`chkconfig –level 35 crond on`命令的执行会将`crond`服务添加到这两个运行级别下的开机启动项中,可以确保服务在这两个运行级别下都自动启动。

当然,如果你只需要在单一的运行级别下使用`crond`服务,可以使用`chkconfig --level <level> <service> on`命令指定相应的运行级别。例如,如果你只在运行级别3下使用`crond`服务,可以使用`chkconfig --level 3 crond on`命令来将其添加到运行级别为3的开机启动项中。

总的来说,`chkconfig crond on`和`chkconfig –level 35 crond on`的区别在于它们添加`crond`服务的运行级别不同,具体的选择可以根据实际需求来决定。

 

可以使用脚本自动完成启动计划任务和添加到开机启动项:

```shell
#!/bin/bash
# start_cron.sh

# 启动计划任务
/etc/init.d/crond start

# 添加到开机启动项
chkconfig crond on
```


1

表示在每天的午夜零点执行`/path/to/myscript.sh`脚本。你可以根据需求调整执行时间,详细的crontab时间设置可以参考Cron语法。

0 0 * * * /path/to/myscript.sh

要在10点5分自动运行脚本,你可以在Crontab的时间字段中指定具体的小时和分钟。修改你的Crontab配置文件,`

5 10 * * * /path/to/myscript.sh

`。

解释一下这个时间字段的含义:
- 第一个字段代表分钟,取值范围是0-59。现在设置为5,表示在每小时的第5分钟触发任务。
- 第二个字段代表小时,取值范围是0-23。现在设置为10,表示在每天的第10小时触发任务。
- 第三个字段代表月份中的日期,取值范围是1-31。
- 第四个字段代表月份,取值范围是1-12。
- 第五个字段代表星期几,取值范围是0-7,其中0和7都代表星期日。

因此,将上述配置保存后,`/path/to/myscript.sh`将会在每天的10点5分自动运行。

请注意,修改Crontab配置需要有相应的权限。你可以使用`crontab -e`命令来编辑用户的Crontab配置文件。如果你是以root用户身份登录的,可以使用`sudo crontab -e`命令来编辑root用户的Crontab配置文件。


实例
每1分钟执行一次command

* * * * * command

每小时的第3和第15分钟执行

3,15 * * * * command

在上午8点到11点的第3和第15分钟执行

3,15 8-11 * * * command

每隔两天的上午8点到11点的第3和第15分钟执行

3,15 8-11 */2 * * command

每个星期一的上午8点到11点的第3和第15分钟执行

3,15 8-11 * * 1 command

每晚的21:30重启smb

30 21 * * * /etc/init.d/smb restart

每月1、10、22日的4 : 45重启smb

45 4 1,10,22 * * /etc/init.d/smb restart

每周六、周日的1:10重启smb

10 1 * * 6,0 /etc/init.d/smb restart

每天18 : 00至23 : 00之间每隔30分钟重启smb

0,30 18-23 * * * /etc/init.d/smb restart

每星期六的晚上11:00 pm重启smb

0 23 * * 6 /etc/init.d/smb restart

每一小时重启smb

* */1 * * * /etc/init.d/smb restart

晚上11点到早上7点之间,每隔一小时重启smb

* 23-7/1 * * * /etc/init.d/smb restart

每月的4号与每周一到周三的11点重启smb

0 11 4 * mon-wed /etc/init.d/smb restart

一月一号的4点重启smb

0 4 1 jan * /etc/init.d/smb restart

每小时执行/etc/cron.hourly目录内的脚本

01 * * * * root run-parts /etc/cron.hourly

我的配置

#!/bin/bash
# 脚本中只要出现执行不是true的语句,就退出不再往下执行
# 导入环境变量
APP_PATH=/xxxx

APP_NAME=xxx
# 判断老的进程是否存在,若存在就杀掉

killjar(){
pid=`ps -ef | grep $APP_NAME.jar | grep java | awk '{print $2}'`
echo "$APP_NAME Id list :$pid"
if [ "$pid" = "" ]
then
echo "no process pid alive"
else
kill -9 $pid
fi
}

# 调用函数
killjar

# 重新启动
#nohup java -jar $APP_PATH/$APP_NAME.jar > \
#$APP_PATH/consoleMsg`date +%Y-%m-%d`.log 2>&1 &

nohup /usr/local/java/jdk1.8.0_341/bin/java -jar $APP_PATH/$APP_NAME.jar > \
$APP_PATH/consoleMsg`date +%Y-%m-%d`.log 2>&1 &



# sleep 10秒, 等待java进程完成起来
sleep 10s

echo 'Start success!'

 

 如果一直报

nohup: failed to run command 'java': No such file or directory

则可以这样写

nohup /usr/local/java/jdk1.8.0_341/bin/java -jar $APP_PATH/$APP_NAME > \
$APP_PATH/consoleMsg`date +%Y-%m-%d`.log 2>&1 &

 

 

参考

#!/bin/bash
#进入当前目录 并自动或jar包
cd `dirname $0`
APP_HOME=`pwd`

APP_NAME="`cd ${APP_HOME} && find -name '*.jar' `"
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh robotcenter.sh [start|stop|restart|status]"
exit 1
}

#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}

#启动方法
start(){
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} is already running. pid=${pid}"
else
nohup java -jar ${APP_NAME} >/dev/null 2>&1 &
#Xms Xmx 指定虚拟内存上下限
#nohup ${JRE_HOME}/bin/java -Xms128m -Xmx512m -jar ${APP_NAME} >/dev/null 2>&1 &
echo "..."
sleep 2
echo "..."
sleep 3
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} is running success. pid=${pid}"
fi
fi
}

#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
echo "..."
sleep 2
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} still in the running. pid=${pid}"
else
echo "${APP_NAME} has stopped running."
fi
else
echo "${APP_NAME} is not running"
fi
}

#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}

#重启
restart(){
stop
#sleep 5
start
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac

 

posted @ 2023-06-30 14:39  全琪俊  阅读(827)  评论(0编辑  收藏  举报