Debian에서 Java 프로그램이 중지되거나 충돌한 후 다시 실행하는 스크립트를 어떻게 만들 수 있나요?

Debian에서 Java 프로그램이 중지되거나 충돌한 후 다시 실행하는 스크립트를 어떻게 만들 수 있나요?

쉘 스크립트를 사용하여 시작해야 하는 Java 서버 프로그램을 실행하고 있습니다. Java 프로그램이 충돌하거나 수동으로 중지된 경우 스크립트는 Java 프로그램을 다시 시작해야 합니다.

이 스크립트를 온라인에서 찾았습니다.

while true
do
   java -jar program.jar
done

하지만 이것은 내 Debian 7 컴퓨터에서는 작동하지 않는 것 같습니다.

./start.sh: line 4: syntax error: unexpected end of file

이는 "Linux" 스크립트로만 출시되었습니다. 데비안에서 어떻게 작동하게 할 수 있나요? 아 예, 스크립트가 아닌 콘솔에 액세스할 수 있는 방법이 없는 한 정기적으로 콘솔에 액세스해야 하기 때문에 스크립트에서 프로그램을 시작하는 것이 중요합니다.

답변1

이것은 완벽하게 유효한 스크립트입니다. 어디서나 잘 작동합니다. 구문 오류가 발생하는 경우 스크립트를 복사/붙여넣을 때 구문 오류가 발생했거나 Thomas가 주석에서 추측한 대로 파일에서 잘못된 줄 종결자를 사용했기 때문입니다.

od아래와 같이 다음 명령을 사용하여 줄 종결자를 확인할 수 있습니다 .

$ od -a foo.sh 
0000000   w   h   i   l   e  sp   t   r   u   e  nl   d   o  nl  sp  sp
0000020  sp   j   a   v   a  sp   -   j   a   r  sp   p   r   o   g   r
0000040   a   m   .   j   a   r  nl   d   o   n   e  nl
0000054

여기에서 내 시스템의 스크립트가 개행 문자를 사용하고 있음을 볼 수 있습니다(즉 nl, 출력에서 ​​바로 뒤). t r u e캐리지 리턴만 보이는 경우:

0000000   w   h   i   l   e  sp   t   r   u   e  cr   d   o  cr  sp  sp

또는 캐리지 리턴/라인 피드 조합:

0000000   w   h   i   l   e  sp   t   r   u   e  cr  nl   d   o  cr  nl

그렇다면 문제를 해결해야 합니다.

sleep모든 것이 제대로 작동하면 다음과 같이 스크립트에 명령을 추가하는 것이 좋습니다 .

while true
do
   java -jar program.jar
   sleep 1
done

일시 중지가 없는 긴밀한 루프는 즉시 충돌이 발생 하면 program.jar많은 CPU를 소비할 수 있습니다 . 작은 일시 중지를 도입하면 이 특정 문제가 크게 해결됩니다.

답변2

Lasquez의 답변은 잘 작성되고 광범위합니다. 그에 따라 투표했습니다.

간단히 설명하자면:

그렇다면 문제를 해결해야 합니다.

Windows CR을 Linux/Unix LF로 변환하는 방법에는 여러 가지가 있습니다. 다음은 몇 가지입니다:
사용 tr:

tr -d '\r' < infile > outfile

사용 sed:

sed 's/^M$//' infile > outfile

마지막으로, Debian을 사용하고 있으므로 dos2unixavailable이라는 패키지가 있을 것입니다. 설치해 보면 매우 간단합니다.

dos2unix myfile

관련 정보