最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot調(diào)用 Shell 腳本實(shí)現(xiàn)看門狗功能

 更新時(shí)間:2020年06月12日 17:27:10   作者:VictorBu  
這篇文章主要介紹了Spring Boot調(diào)用 Shell 腳本實(shí)現(xiàn)看門狗功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

需要實(shí)現(xiàn)看門狗功能,定時(shí)檢測(cè)另外一個(gè)程序是否在運(yùn)行,使用 crontab 僅可以實(shí)現(xiàn)檢測(cè)程序是否正在運(yùn)行,無(wú)法做到擴(kuò)展,如:手動(dòng)重啟、程序升級(jí)(如果只需要實(shí)現(xiàn)自動(dòng)升級(jí)功能可以使用 inotify)等功能;最后決定使用 Spring Boot 調(diào)用 Shell 腳本來(lái)實(shí)現(xiàn)

一、腳本

1.1 啟動(dòng)腳本

#!/bin/bash

ps -ef | grep "demo-app-0.0.1-SNAPSHOT.jar" | grep -v "grep"

if [ "$?" -eq 0 ]
then

# sleep
echo $(date "+%Y-%m-%d %H:%M:%S") "process already started!"

else

nohup java -jar -server /project/watchdog/demo-app-0.0.1-SNAPSHOT.jar &
echo $(date "+%Y-%m-%d %H:%M:%S") "process has been started!"

fi

1.2 重啟腳本

#!/bin/bash

pid=`ps -ef | grep "demo-app-0.0.1-SNAPSHOT.jar" | grep -v "grep" | awk '{print $2}'`

for id in $pid
do
 kill -9 $id
 echo "killed $id"
done

nohup java -jar -server /project/watchdog/demo-app-0.0.1-SNAPSHOT.jar &
echo $(date "+%Y-%m-%d %H:%M:%S") "process has been restarted!"

二、功能實(shí)現(xiàn)

將腳本放置在程序的資源目錄下,每次程序啟動(dòng)時(shí)將腳本讀取到指定位置,然后再通過(guò)定時(shí)任務(wù)執(zhí)行腳本

配置內(nèi)容:

shell:
 directory: /project/watchdog
 startupFileName: startup.sh
 restartFileName: restart.sh
@Configuration
@ConfigurationProperties(prefix = "shell")
public class ShellProperties {

 private String directory;
 private String startupFileName;
 private String restartFileName;

 /* getter & setter */

 public String getFullName(String fileName) {
 return directory + File.separator + fileName;
 }
}

2.1 啟動(dòng)時(shí)將腳本讀取到指定位置

@Component
public class InitRunner implements CommandLineRunner {

 @Autowired
 private ShellProperties shellProperties;

 @Autowired
 ResourceLoader resourceLoader;

 @Override
 public void run(String... args) throws Exception {
 generateFile(shellProperties.getStartupFileName());
 generateFile(shellProperties.getRestartFileName());
 }

 private void generateFile(String fileName) throws IOException {

 String fileFullName = shellProperties.getFullName(fileName);
 File file = new File(fileFullName);
 if(file.exists()) {
 return;
 }

 // 如果文件已存在,F(xiàn)ileWriter 會(huì)先刪除再新建
 FileWriter fileWriter = new FileWriter(fileFullName);

 Resource resource = resourceLoader.getResource("classpath:" + fileName);
 InputStream inputStream = resource.getInputStream();
 InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
 BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

 String data;
 while ((data = bufferedReader.readLine()) != null) {
 fileWriter.write(data + "\n");
 }

 bufferedReader.close();
 inputStreamReader.close();
 inputStream.close();

 fileWriter.close();

 // 設(shè)置權(quán)限,否則會(huì)報(bào) Permission denied
 file.setReadable(true);
 file.setWritable(true);
 file.setExecutable(true);
 }
}

2.2 定時(shí)任務(wù)定時(shí)任務(wù)執(zhí)行腳本

@Component
public class ShellTask {

 private static final Logger logger = LoggerFactory.getLogger(ShellTask.class);

 @Autowired
 private ShellProperties shellProperties;

 @Scheduled(cron = "0/10 * * * * ? ")
 public void start() throws IOException {
 executeShell(shellProperties.getStartupFileName());
 }

 private void executeShell(String fileName) throws IOException {

 String fileFullName = shellProperties.getFullName(fileName);
 File file = new File(fileFullName);
 if(!file.exists()) {
 logger.error("file {} not existed!", fileFullName);
 return;
 }

 ProcessBuilder processBuilder = new ProcessBuilder(fileFullName);
 processBuilder.directory(new File(shellProperties.getDirectory()));

 Process process = processBuilder.start();

// String input;
// BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
// BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
// while ((input = stdInput.readLine()) != null) {
// logger.info(input);
// }
// while ((input = stdError.readLine()) != null) {
// logger.error(input);
// }

 int runningStatus = 0;
 try {
 runningStatus = process.waitFor();
 } catch (InterruptedException e) {
 logger.error("shell", e);
 }

 if(runningStatus != 0) {
 logger.error("failed.");
 }else {
 logger.info("success.");
 }
 }
}

2.3 擴(kuò)展

本例只實(shí)現(xiàn)了定時(shí)檢測(cè)程序是否運(yùn)行,如果沒(méi)有運(yùn)行則啟動(dòng)程序;如有需要可以添加接口,調(diào)用接口重啟程序;或者添加定時(shí)任務(wù)定時(shí)檢測(cè)程序是否有更新,如果有更新則下載新的 jar 包然后重啟程序

看門狗程序自己可以使用 crontab 定時(shí)檢測(cè)是否正在運(yùn)行,模仿上面的啟動(dòng)腳本編寫看門狗的啟動(dòng)腳本,然后添加定時(shí)任務(wù):

crontab -e
*/10 * * * * /project/watchdog/watchdog.sh
sudo systemctl reload crond.service

完整代碼:GitHub

參考:java去調(diào)用并執(zhí)行shell腳本以及問(wèn)題總結(jié)

總結(jié)

到此這篇關(guān)于Spring Boot調(diào)用 Shell 腳本實(shí)現(xiàn)看門狗功能的文章就介紹到這了,更多相關(guān)spring boot 看門狗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Javassist如何操作Java 字節(jié)碼

    Javassist如何操作Java 字節(jié)碼

    這篇文章主要介紹了Javassist如何操作Java 字節(jié)碼,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • SpringTask實(shí)現(xiàn)定時(shí)任務(wù)方法講解

    SpringTask實(shí)現(xiàn)定時(shí)任務(wù)方法講解

    通過(guò)重寫Schedu lingConfigurer方法實(shí)現(xiàn)對(duì)定時(shí)任務(wù)的操作,單次執(zhí)行、停止、啟動(dòng)三個(gè)主要的基本功能,動(dòng)態(tài)的從數(shù)據(jù)庫(kù)中獲取配置的定時(shí)任務(wù)cron信息,通過(guò)反射的方式靈活定位到具體的類與方法中
    2023-02-02
  • springboot自動(dòng)配置原理以及spring.factories文件的作用詳解

    springboot自動(dòng)配置原理以及spring.factories文件的作用詳解

    這篇文章主要介紹了springboot自動(dòng)配置原理以及spring.factories文件的作用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Maven構(gòu)建Hadoop項(xiàng)目的實(shí)踐步驟

    Maven構(gòu)建Hadoop項(xiàng)目的實(shí)踐步驟

    本文主要介紹了Maven構(gòu)建Hadoop項(xiàng)目的實(shí)踐步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類

    Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類

    這篇文章主要介紹了Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • springboot集成fastDfs過(guò)程代碼實(shí)例

    springboot集成fastDfs過(guò)程代碼實(shí)例

    這篇文章主要介紹了springboot集成fastDfs過(guò)程代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 解決Maven項(xiàng)目pom.xml導(dǎo)入了Junit包還是用不了@Test注解問(wèn)題

    解決Maven項(xiàng)目pom.xml導(dǎo)入了Junit包還是用不了@Test注解問(wèn)題

    在Maven項(xiàng)目中,如果在非test目錄下使用@Test注解,可能會(huì)因?yàn)閜om.xml中<scope>test</scope>的設(shè)置而無(wú)法使用,正確做法是將測(cè)試代碼放在src/test/java目錄下,或去除<scope>test</scope>限制,這樣可以確保Junit依賴正確加載并應(yīng)用于適當(dāng)?shù)拇a部分
    2024-10-10
  • Java多線程4種拒絕策略小結(jié)

    Java多線程4種拒絕策略小結(jié)

    當(dāng)線程池中的任務(wù)隊(duì)列已滿且無(wú)法再接受新的任務(wù)時(shí),就需要采取拒絕策略來(lái)處理這種情況,本文主要介紹了Java多線程拒絕策略,包含了四種常見(jiàn)的拒絕策略,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • SpringBoot3集成Swagger3的詳細(xì)教程

    SpringBoot3集成Swagger3的詳細(xì)教程

    Swagger 3(OpenAPI 3.0)提供了更加強(qiáng)大和靈活的API文檔生成能力,本教程將指導(dǎo)您如何在Spring Boot 3項(xiàng)目中集成Swagger3,并使用Knife4j作為UI界面,需要的朋友可以參考下
    2024-03-03
  • Java響應(yīng)式編程之handle用法解析

    Java響應(yīng)式編程之handle用法解析

    這篇文章主要介紹了Java響應(yīng)式編程之handle用法解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評(píng)論

内丘县| 清水河县| 彭泽县| 瑞安市| 崇信县| 陇南市| 黄平县| 资阳市| 华蓥市| 屏边| 东光县| 庆阳市| 徐闻县| 法库县| 沐川县| 新河县| 绥滨县| 黄龙县| 杭锦旗| 资溪县| 马关县| 大城县| 东明县| 堆龙德庆县| 东莞市| 红桥区| 海兴县| 卢龙县| 施甸县| 周至县| 遂川县| 德安县| 昭通市| 东台市| 叶城县| 姜堰市| 玉屏| 剑河县| 成都市| 庆云县| 长白|