데비안에서는 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

larsks의 답변은 잘 작성되고 광범위합니다. 이에 따라 찬성표가 주어졌습니다.

다음 사항에 대해 간단히 알아보세요.

그러면 그것을 고쳐야 할 것입니다.

Windows CR을 Linux/Unix LF로 변환하는 방법은 다양합니다. 다음은 몇 가지입니다:
사용 tr:

tr -d '\r' < infile > outfile

사용 sed:

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

마지막으로 Debian을 사용하고 있으므로 dos2unixavailable이라는 패키지가 있을 수 있습니다. 설치하면 다음과 같이 간단합니다.

dos2unix myfile

관련 정보