Spring Boot 는 Shell 스 크 립 트 를 호출 하여 문 지 키 는 개 기능 을 실현 합 니 다.

문 지 키 는 개 기능 을 실현 해 야 합 니 다.다른 프로그램 이 실행 되 고 있 는 지 정기 적 으로 확인 해 야 합 니 다.crontab 를 사용 하면 프로그램 이 실행 되 고 있 는 지 확인 할 수 있 을 뿐 확장 할 수 없습니다.예 를 들 어 수 동 재 부팅,프로그램 업그레이드(자동 업그레이드 기능 만 실현 하면 사용 할 수 있 습 니 다inotify등 기능 이 있 습 니 다.마지막 으로 Spring Boot 를 사용 하여 Shell 스 크 립 트 를 호출 하기 로 결 정 했 습 니 다.
대본
1.1 시작 스 크 립 트

#!/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!"
기능 실현
스 크 립 트 를 프로그램의 자원 디 렉 터 리 에 두 고 프로그램 이 시 작 될 때마다 스 크 립 트 를 지정 한 위치 로 읽 은 다음 정시 작업 을 통 해 스 크 립 트 를 실행 합 니 다.
설정 내용:

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 시작 할 때 스 크 립 트 를 지정 한 위치 로 읽 기

@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;
 }

 //        ,FileWriter        
 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 + "
"); } bufferedReader.close(); inputStreamReader.close(); inputStream.close(); fileWriter.close(); // , Permission denied file.setReadable(true); file.setWritable(true); file.setExecutable(true); } }
2.2 정시 퀘 스 트 정시 퀘 스 트 실행 스 크 립 트

@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 확장
이 예 는 프로그램 이 실 행 될 지 여 부 를 정기 적 으로 검사 하고 실행 되 지 않 으 면 프로그램 을 시작 합 니 다.필요 하 다 면 인 터 페 이 스 를 추가 하고 인터페이스 재 부팅 프로그램 을 호출 할 수 있 습 니 다.또는 정시 작업 을 추가 하여 정기 적 으로 프로그램 이 업데이트 되 었 는 지 확인 하고 업데이트 가 있 으 면 새 jar 패 키 지 를 다운로드 한 후 프로그램 을 다시 시작 합 니 다.
문 을 지 키 는 개 프로그램 은 crontab 를 사용 하여 실행 중인 지 여 부 를 정기 적 으로 확인 할 수 있 습 니 다.위의 시작 스 크 립 트 를 모방 하여 문 을 지 키 는 개의 시작 스 크 립 트 를 작성 한 다음 에 시간 임 무 를 추가 할 수 있 습 니 다.

crontab -e
*/10 * * * * /project/watchdog/watchdog.sh
sudo systemctl reload crond.service
전체 코드:GitHub
참고:자바 셸 스 크 립 트 호출 및 실행 및 문제 요약
총결산
Spring Boot 가 Shell 스 크 립 트 를 호출 하여 문 을 지 키 는 개 기능 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 spring boot 문 을 지 키 는 개 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기