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 문 을 지 키 는 개 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.