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

supervisor杀死不掉程序的问题分析

项目场景:

supervisor可以说是linux上大名鼎鼎的守护进程工具了,它的易用性在我所有用过的工具里算是排名前列的。但在使用过程中也不免会出一些问题,很多都是设置错误导致的。


问题描述

使用java启动一个jar,调用stop的时候jar程序还是留存在后台。


原因分析:

这并不是supervisor的bug,也不是你的程序写的有问题。由于很多java项目都需要初始化很多变量,很多人选择了在shell里面导出环境变量,然后在shell里面启动java程序。

这样导致一个问题,supervisor守护进程守护的不是你的jar,而是你用来初始化环境变量的shell脚本。所以导致了stop之后java程序留存后台的问题。


解决方案:

这可能也是supervisor的运作机制导致的,如果你不用初始化变量,你就直接在command里面启动jar就行了,如果你你必须初始化变量不如使用supervisor自带的environment字段配置变量。

下面是错误的写法:

xf.conf

[program:xf]
directory=/home/anold/XTTS
command=bash xf_tts.sh

autostart=true
autorestart=true
user=root
redirect_stderr=true
stdout_logfile = /home/anold/XTTS/starts.log
stdout_logfile_maxbytes = 50MB
staout_logfile_backups = 5

xf_tts.sh

#!/bin/bash

export LD_LIBRARY_PATH=/home/anold/XTTS/libs:$LD_LIBRARY_PATH

echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"
echo "Directory: " && pwd

java -jar xf_tts_demo-1.0-SNAPSHOT.jar

上面的写法会在supervisorctl调用stop之后杀死xf_tts.sh而不是xf_tts_demo-1.0-SNAPSHOT.jar,因为xf_tts.shxf_tts_demo-1.0-SNAPSHOT.jar的父进程,当父进程被杀死,子进程就成了孤儿进程最终被systemd托管,所以可以一直存活,直到自己崩溃为止!

下面是正确的写法:

[program:xf]
directory=/home/anold/XTTS
command=java -jar xf_tts_demo-1.0-SNAPSHOT.jar
autostart=true
autorestart=true
user=root
redirect_stderr=true
stdout_logfile = /home/anold/XTTS/starts.log
stdout_logfile_maxbytes = 50MB
staout_logfile_backups = 5
environment=LD_LIBRARY_PATH="/home/anold/XTTS/libs",NAME="anold"

environment里面配置的环境变量会代入subprogress,这样你可以在command里面读取到。这样就同时解决了环境变量和程序杀不死的问题。

总结:

supervisor这个工具用好很重要,我觉得是linux必不可少的神器。但是,神器有时候有它自己的脾气。


http://www.kler.cn/news/161119.html

相关文章:

  • (动手学习深度学习)第13章 实战kaggle竞赛:树叶分类
  • 4G基站BBU、RRU、核心网设备
  • VUE+THREE.JS 点击模型相机缓入查看模型相关信息
  • 云计算生成式 -给你不一样的音乐推荐新体验
  • 英伟达显卡系列与架构、代表产品
  • 基于JavaScript的jimp库处理图片,添加绘制点
  • 【华为od】存在一个m*n的二维数组,其成员取值范围为0,1。其中值为1的元素具备扩散性,每经过1S,将上下左右值为0的元素同化为1。
  • 要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 23 章:命名实体识别提示
  • 《QDebug 2023年11月》
  • 要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 7 章:让我们想一想 提示语
  • 背包问题学习
  • 数据结构与算法编程题50
  • NC 比telnet 强大网络命令
  • 我有才打造知识付费小程序
  • simulink trigger模块使用——多种调用案例分析
  • 出海电商中的技术护航:Socks5代理与代理IP的应用
  • 第16关 革新云计算:如何利用弹性容器与托管K8S实现极速服务POD扩缩容
  • JVM垃圾回收机制GC
  • Spring cloud - gateway
  • 【微软技术栈】基于任务的异步编程
  • 简单3D姿态基线模型网络架构与验证【SIM】
  • 生成器简述 - python 基础进阶知识点补全(一)
  • 【C++】多线程(二):std::mutex std::atomic的使用
  • hive里如何高效生成唯一ID
  • 私域最全养号攻略---微信
  • springboot(ssm甘肃旅游工艺品商城 旅游管理系统Java(codeLW)
  • uniapp app将base64保存到相册,uniapp app将文件流保存到相册
  • Scrapy框架中间件(一篇文章齐全)
  • layui学习笔记
  • K8S pod无损上下线