나는 Java 실행 가능한 jar를 가지고 있고 그것이 실행되지 않거나 어떤 이유로 인해 종료되면 이를 실행해야 하므로 이를 위해 crontab을 사용하기로 결정했습니다.
"poppetapp" 사용자로 crontab을 실행해야 했기 때문에 해당 사용자로 로그인하고 다음과 같은 crontab을 만들었습니다.
*/5 * * * * pgrep -f test_java_10.jar || cd /home/poppetapp && /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out
내 쉘 스크립트는 다음과 같습니다. 위치는 /home/poppetapp/
-
#!/bin/sh
/usr/home/java -jar /home/poppetapp/test_java_10.jar
내 Java 실행 가능 jar은 "poppetapp" 사용자의 홈 위치에 있습니다 /home/poppetapp/
.
그래서 제 질문은 - 이게 맞는 것 같나요? test_java_10.jar
실행되지 않거나 어떤 이유로 종료된 경우에만 시작하면 되므로 실행 중인지 확인하기 위해 5분마다 실행되는 crontab을 만들었습니다. 실행 중이 아니면 쉘 스크립트를 실행하여 프로세스를 시작합니다 test_java_10.jar
.
하지만 어떻게든 crontab을 변경하면 많은 test_java_10.jar
프로세스가 호출되는 것을 발견합니다. 5분마다 이에 대한 또 다른 프로세스가 시작되는 것 같습니다.
고쳐 쓰다:-
crontab을 이렇게 수정하면 -
*/5 * * * * pgrep -f test_java_10.jar || /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out
그러다가 다음 이메일을 보았는데, 문제가 무엇인지 설명하지 않았거나 설명이 있습니까?
& t 35
Message 35:
From poppetapp@machineA Tue Mar 24 17:05:01 2015
X-Original-To: poppetapp
From: root@machineA (Cron Daemon)
To: poppetapp@machineA
Subject: Cron <poppetapp@machineA> pgrep -f test_java_10.jar || /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/poppetapp>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=poppetapp>
Date: Tue, 24 Mar 2015 17:05:01 -0700 (GMT+7)
답변1
제 생각에는 그룹화 문제가 아닐까 싶습니다. 귀하의 전화를 pgrep
간단한 또는 다음으로 대체 했습니다 .true
false
프로세스가 실행되고 있지 않으면
pgrep
실패합니다.$ false || echo cd && echo run cd run
프로세스가 실행 중이면
pgrep
성공합니다.$ true || echo cd && echo run run
이 경우에는 아무 것도 실행되는 것을 원하지 않습니다! 실행할 때
true || (echo cd && echo run)
아무것도 표시하지 않는 것이 우리가 원하는 것입니다.
나는 그것을 시도해 보는 것이 좋습니다 pgrep -f test_java_10.jar || (cd /home/poppetapp && /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out)
.
답변2
비슷한 장점 ||
은 반환 코드를 기반으로 무언가를 실행할 수 있다는 것입니다. 예를 들어, 왼쪽이 있으면 false
오른쪽을 평가하고, 그렇지 않으면 신경쓰지 않습니다.
그러나 여기에 문제가 있습니다. pgrep의 매뉴얼 페이지를 살펴보십시오.
pgrep 및 pkill 유틸리티는 종료 시 다음 값 중 하나를 반환합니다. 0은 하나 이상의 프로세스와 일치합니다. 1 일치하는 프로세스가 없습니다.
그래서 실제로 그렇습니다 0
.false
성냥- 실제로는 Java 프로세스가 이미 실행 중인 경우에만 시작됩니다. :).
||
로 전환 &&
하면 원하는 결과를 얻을 수 있습니다. 하지만 실제로는 미래의 독자들이 같은 것을 알아낼 필요가 없도록 이것을 스크립트에 넣을 것을 제안하고 싶습니다.
나는 제안하고 싶습니다 - grep 프로세스는 본질적으로 약간 신뢰할 수 없습니다. pid
파일을 잠그거나 이를 통해 이 작업을 수행할 수 있습니다 .
답변3
조셉 R나보다 논리를 더 잘 설명했다.
cd /home/poppetapp &&
원하는 결과를 얻으려면 다음 항목만 제거하고 사용하는 것이 좋습니다 .
*/5 * * * * pgrep -f test_java_10.jar || /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out
답변4
||
and 연산자의 우선순위 문제를 방지하려면 &&
논리를 스크립트로 옮기면 됩니다.
#!/bin/sh -e
if ! pgrep -f test_java_10.jar >&2; then
cd "$HOME"
/usr/home/java -jar ./test_java_10.jar
fi
그런 다음 5분마다 crontab에서 이 스크립트를 호출합니다.
*/5 * * * * "$HOME/test_java.sh"