Java 프로젝트를 실행하는 몇 가지 논리가 있습니다. 다음을 입력하면 이 모든 것이 터미널 콘솔에서는 작동하지만 cron 스케줄러에서는 작동하지 않습니다.
첫 번째 마이크로서비스를 실행하고 POST 요청에서 변수를 가져옵니다.
java -jar /root/parser-0.0.1-SNAPSHOT.jar
value=$(curl -d '{"query":"java-middle", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer)
v2=$(echo ${value} | jq '.id')
시험:
echo $v2
18
18 - 데이터베이스의 ID, 다음 요청에 사용합니다: (먼저 새 마이크로서비스 실행)
java -jar parsdescription-0.0.1-SNAPSHOT.jar
value=$(curl -d '{"explorerId":'$v2', "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/descriptions) >> /var/log/description3.log 2>&1
그래서,곱슬잘 실행되었습니다. 데이터베이스가 일부 데이터로 채워지고값올바른 값을 얻습니다.
그러나 crontab 일정을 만들 때:
50 09 * * * java -jar /root/parser-0.0.1-SNAPSHOT.jar
51 09 * * * value=$(curl -d '{"query":"java-middle", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer)
52 09 * * * v2=$(echo ${value} | jq '.id')
53 09 * * * java -jar parsdescription-0.0.1-SNAPSHOT.jar
54 09 * * * value=$(curl -d '{"explorerId":'$v2', "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/descriptions) >> /var/log/description3.log 2>&1
그런 다음 일반적으로 첫 번째 컬만 실행됩니다(데이터베이스에 새 주석 생성). 다음 - 두 번째 마이크로서비스가 실행되지만( 53 09 * * * java -jar parsdescription-0.0.1-SNAPSHOT.jar ) 두 번째 마이크로서비스는 실행되지 않습니다.곱슬명령을 내리고 아무것도 저장되지 않았습니다설명3.log파일 - 비어 있습니다.
콘솔에서는 작동하지만 crontab에서는 작동하지 않는 이유는 무엇입니까?
답변1
각 크론 작업은 고유한 셸 인스턴스이며 다른 크론 작업과 상태를 공유하지 않습니다.
51 09 * * * value=42
이 작업에 대해서만 설정하면 value
작업이 종료되고 value
손실됩니다. 대조적으로, 쉘 세션은 연속된 라인에서 상태를 유지합니다. 모든 코드를 실행하는 크론 작업이 필요하거나 다음과 같은 다른 디자인이 필요할 수 있습니다.
51 09 * * * /path/to/your/script
그런 다음 파일은 /path/to/your/script
실행 가능해야 하며 다음을 포함해야 합니다.
#!/bin/bash
java -jar /root/parser-0.0.1-SNAPSHOT.jar
value=$(curl -d '{"query":"java-middle", ...
등.
서로 다른 cron 작업 간에 데이터를 공유해야 하는 경우 일부 IPC(프로세스 간 통신) 방법(파일 시스템, 데이터베이스 등)을 통해 정보를 공유해야 합니다.