Skip to content

Crontab 定时重启服务

启动脚本

shell
./service.sh start

关闭脚本

shell
./service.sh stop

重启脚本

shell
./service.sh restart

脚本下载

service.sh
bash
#!/bin/bash
# 只需要更具实际情况修改 APP_HOME APP_NAME 就行了
#java服务包路径
APP_HOME=/root/demo
#java服务包名称
APP_NAME=demo-0.0.1-SNAPSHOT.jar
APP_ALL_NAME=$APP_HOME/$APP_NAME
 
#JVM参数
JVM_OPTS="-Dname=$APP_NAME -XX:+UseG1GC -Xms16g -Xmx16g -Dspring.profiles.active=port "

#是否打印日志
IS_LOG=True
#日志路径
LOG_PATH=$APP_HOME/logs
#日志名称
LOG_NAME=$APP_NAME.log
LOG_ALL_NAME=$APP_HOME/$LOG_NAME
mkdir -p $LOG_PATH

PID=""
 
if [ "$1" = "" ];
then
    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
    exit 1
fi
 
if [ "$APP_ALL_NAME" = "" ];
then
    echo -e "\033[0;31m 未输入应用名 \033[0m"
    exit 1
fi
 
function start()
{
    PID=`ps -ef |grep java|grep $APP_ALL_NAME|grep -v grep|awk '{print $2}'`
 
    if [ x"$PID" != x"" ]; then
        echo -e "\033[42;5m Runing \033[0m $APP_ALL_NAME (pid:$PID) 服务正在运行中..."
    else
            echo -e "\033[43;5m Starting \033[0m $APP_ALL_NAME 服务正在启动中..."
            if [ "$IS_LOG" = "True" ]; then
                nohup java -jar  $JVM_OPTS $APP_ALL_NAME 1>$LOG_ALL_NAME 2>$LOG_ALL_NAME &
                query
                echo -e "\033[43m Start \033[0m $APP_ALL_NAME (pid:$PID) 服务启动成功...(日志路径$LOG_ALL_NAME)"
            else
                nohup java -jar  $JVM_OPTS $APP_ALL_NAME > /dev/null 2>&1 &
                query
                echo -e "\033[43m Start \033[0m $APP_ALL_NAME (pid:$PID) 服务启动成功..."
            fi
    fi
}
 
function stop()
{
    
    query
    if [ x"$PID" != x"" ]; then
        kill -TERM $PID
        echo -e "\033[41;5m Stoping \033[0m $APP_ALL_NAME (pid:$PID) 服务正在停止中..."
        while [ x"$PID" != x"" ]
        do
            sleep 1
            query
        done
        echo -e "\033[41m Stop \033[0m $APP_ALL_NAME 服务已停止..."
    else
        echo -e "\033[41m Stop \033[0m $APP_ALL_NAME 服务已停止..."
    fi
}
 
function restart()
{
    stop
    sleep 2
    start
}
 
function status()
{
    PID=`ps -ef |grep java|grep $APP_ALL_NAME|grep -v grep|wc -l`
    if [ $PID != 0 ];then
        echo -e "\033[42;5m Runing \033[0m $APP_ALL_NAME 服务正在运行中..."
    else
        echo -e "\033[41m Stop \033[0m  $APP_ALL_NAME 服务已停止..."
    fi
}

function query(){
    PID=`ps -ef |grep java|grep $APP_ALL_NAME|grep -v grep|awk '{print $2}'`
}

case $1 in
    start)
    start;;
    stop)
    stop;;
    restart)
    restart;;
    status)
    status;;
    *)
esac
health-check.sh
base
#!/bin/bash
# 声明接口地址,服务端口号
HEALTH_URL=http://127.0.0.1:8080
SERVICE_SH=/root/demo/service.sh
# 添加服务状态检查方法
checkHealth(){
	result=$(curl --connect-timeout 1 -m 1 -s ${HEALTH_URL} | grep OK)
	if [ "$result" != "" ]; then
		return "1"
	else
		return "0"
	fi
}

checkHealth

# 结果判断打印
if [ $? -eq "1" ];then
	echo "服务正在运行中..."
else
	echo "服务已停止运行..."
	$SERVICE_SH start
fi

TIP

脚本里根据不同的项目设置里面 APP_HOMEAPP_NAMEJVM_OPTS 这三个值。

crontab相关命令

以下命令已在 Ubuntu 22.04 实测无任何问题,其他系统自测

查看当前用户的定时任务列表

shell
crontab -l

编辑当前用户的定时任务列表

shell
crontab -e

# 每分钟执行脚本 
* * * * * /path/to/script.sh

# 每周星期一凌晨一点执行脚本
0 1 * * 1 /path/to/script.sh
# 每周六凌晨一点执行脚本
0 1 * * 6 /path/to/script.sh
# 每周日凌晨一点执行脚本
0 1 * * 7 /path/to/script.sh

# 每月一日凌晨一点执行脚本
0 1 1 * * /path/to/script.sh
# 每月二十八日凌晨一点执行脚本
0 1 28 * * /path/to/script.sh

# 每年一月凌晨一点执行脚本
0 1 1 1 * /path/to/script.sh 
# 每年十二月凌晨一点执行脚本
0 1 12 1 * /path/to/script.sh 
# 每年一月, 三月, 五月, 七月, 九月, 和 十一月份凌晨一点执行脚本
0 1 1 1,3,5,7,9,11 * /path/to/script.sh 

# 如果需要输出脚本执行的内容建议在测试脚本时候开启入输出内容正常关闭即可
* * * * * /path/to/script.sh > /var/log/cron.log 2>&1

crontab.png

删除当前用户的定时任务列表

shell
crontab -r

服务状态

shell
systemctl status cron

服务启动

shell
systemctl start cron

服务关闭

shell
systemctl stop cron

数据业务研发中心