当前位置: 首页 > news >正文

linux环境定时重启服务的流程分享

linux环境定时重启服务是很常见需求

一、定时重启jar包

linux环境我有一个springBoot 框架的 java服务,包名称是demo.jar,端口号是暂定8081。每天凌晨1点重启一下这个服务。

1、创建脚本文件

sudo nano /opt/scripts/demo_restart.sh

2、脚本内容

#!/bin/bash

# ==========================================
# 服务信息配置
# ==========================================
SERVICE_NAME="demo-service"          # 服务名称(用于日志标识)
JAR_PATH="/usr/local/nandao/server/demo-service.jar" # 服务JAR包绝对路径
PORT=8081                    # 服务端口号
LOG_FILE="/usr/local/nandao/server/${SERVICE_NAME}_restart.log" # 操作日志路径

# ==========================================
# 功能函数:检查端口是否已被占用
# ==========================================
is_port_active() {
  netstat -tuln | grep -q ":$PORT "
  return $?
}

# ==========================================
# 记录操作日志
# ==========================================
log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

# ==========================================
# 主流程
# ==========================================
log "========== 开始重启服务 ${SERVICE_NAME} =========="

# 阶段1:停止旧服务
log "正在停止服务..."
PID=$(lsof -ti :$PORT)
if [ -n "$PID" ]; then
  kill $PID
  sleep 10 # 等待正常终止
  
  # 检查是否终止成功
  if ps -p $PID > /dev/null; then
    log "检测到进程残留,强制终止 PID: $PID"
    kill -9 $PID
  fi
else
  log "未找到运行中的服务进程"
fi

# 阶段2:启动新服务
log "正在启动服务..."
nohup java -Dserver.port=8081 -jar $JAR_PATH >> /usr/local/nandao/server/logs/demo.log 2>&1 &

# 阶段3:验证启动状态
sleep 30 # 等待服务初始化
if is_port_active; then
  log "服务启动成功"
else
  log "服务启动失败!请检查日志 /usr/local/nandao/server/logs/demo.log"
fi

log "========== 操作完成 ==========\n"

3、授权脚本

sudo chmod +x /opt/scripts/demo_restart.sh

4、配置定时任务

# 编辑root用户的crontab(推荐使用root权限)
sudo crontab -e



#最后行添加内容
0 1 * * * /opt/scripts/demo_restart.sh


#查看定时任务列表
sudo crontab -l

5、手动测试

# 执行重启脚本
sudo /opt/scripts/demo_restart.sh

# 查看实时日志
tail -f /var/log/demo_restart.log

6、检查状态

# 查看端口占用
ss -tuln | grep 8081

# 查看服务进程
ps aux | grep "java -jar /opt/app/demo.jar"

# 查看应用日志
tail -f /opt/app/logs/demo.log

7、报错解决

./demo_restart.sh 
-bash: ./demo_restart.sh: /bin/bash^M: bad interpreter: No such file or directory

原因:错误信息中的 ^M 字符表明脚本文件包含 Windows 换行符(CRLF),而 Linux 系统要求使用 Unix 换行符(LF)

清除方式:

# 方法1:安装并使用 dos2unix 工具
sudo apt install dos2unix -y      # Debian/Ubuntu
sudo yum install dos2unix -y     # CentOS/RHEL
dos2unix waster_service_restart.sh

# 方法2:使用 sed 命令直接替换
sed -i 's/\r$//' waster_service_restart.sh

# 方法3:用 vim 手动修正
vim waster_service_restart.sh
# 进入 vim 后输入:
:set ff=unix
:wq

验证:

# 查看换行符是否已修正
cat -v demo_restart.sh | head -n1
# 正确输出应显示 `#!/bin/bash` 而不是 `#!/bin/bash^M`

 到此,定时重启jar包分享完成。

二、

相关文章:

  • 关于FocalLoss 损失函数
  • 【C++算法】54.链表_合并 K 个升序链表
  • Ansible:role企业级实战
  • 4-6记录(B树)
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第七讲)
  • 【React】副作用 setState执行流程 内置钩子(Effect Callback Reducer)React.memo
  • 从 STP 到 RSTP 再到 MSTP:网络生成树协议的工作机制与发展
  • Docker部署.NetCore8项目
  • 【Axure视频教程】中继器表格轮播含暂停效果
  • 蓝桥杯真题:数字串个数
  • 【今日三题】小乐乐改数字 (模拟) / 十字爆破 (预处理+模拟) / 比那名居的桃子 (滑窗 / 前缀和)
  • Spring Security6 从源码慢速开始
  • 系统思考—提升解决动态性复杂问题能力
  • C++对象生命周期管理:从构造到析构的完整指南
  • Unity Addressables资源生命周期自动化监控技术详解
  • 【智能指针】—— 我与C++的不解之缘(三十三)
  • 02-redis-源码下载
  • mysql-锁的算法(记录锁、间隙锁、临键锁)
  • 【电商】基于LangChain框架将多模态大模型连接数据库实现精准识别
  • 基于CNN-GRU的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码