2012-07-25 3 views
1

자, 리눅스 서버에서 chron 작업을 사용하여 실행중인 몇 가지 Java 프로그램이 있습니다. 이러한 작업은 10 분마다 실행되고, 문자 그대로 2 분만 실행 한 다음 종료됩니다. 프로그램을 감지 할 수있는 방법을 추가해야합니다. 시작될 때, 이미 실행중인 인스턴스가있는 경우, 더 이상 진행하지 않고 종료하려면 추가해야합니다. 나는 이것을 처리 할 수있는 최선의 방법에 대해 정말로 확신하지 못하고 누군가가 조언을 해줄 수 있기를 바라고 있습니다.리눅스 컴퓨터에서 실행중인 java 프로그램을 감지하십시오.

내가 생각했던 한 가지 접근법은 일종의 PS 명령을 수행하는 Java 코드에서 명령 줄 인수를 실행하고 실행중인 코드가 있는지 살펴 봅니다. 아주 작고 뭔가 까다 롭지 만 복잡하고 까다 롭습니다. 게다가, 나는 리눅스에 익숙하지 않고 그것을 할 수있는 최선의 방법조차 모르고있다. 누구든지 더 좋은 생각을 갖고 있다면 알려 주시기 바랍니다. 또는 그것이 최선의 방법이라면, 리눅스 명령을 제공 할 수 있다면 나는 그것을 고맙게 생각할 것입니다. 감사. 이 밖에

+3

모두 함께 퍼팅

,이 같은 파일을 만들 수 있습니다. –

+0

실제로 java와 전혀 관련이 없습니다. 같은 문제가 모든 언어에 적용됩니다. –

+0

쉘 스크립트에서 java-program의 호출을 감싸고 ps per와 grep과 같은 ps'uxuxww | grep <당신의 mainclass>'잠금 파일의 문제점은 자바 프로그램이 망가 졌을 때 정리가 안된다는 것입니다. – jayeff

답변

1

쓰기 가능한/tmp 디렉토리가있는 경우 잠금 파일을 사용할 수 있습니다.

Java 프로그램이 시작되면/tmp 디렉토리에서 응용 프로그램에 고유 한 이름 (예 : "my-lock-file.lock")이있는 파일을 확인하십시오. 존재하지 않는 경우 하나를 작성하고 완료하면 제거하십시오. 존재하는 경우 그냥 종료하십시오.

java.io.File 클래스의 .exists() 메소드를 사용하여 파일의 존재 여부를 확인할 수 있습니다.

코드를 이식해야하는 경우 System.getProperty("java.io.tmpdir"));을 사용하면 코드가 실행되는 플랫폼에 적절한 임시 디렉토리를 가져올 수 있습니다.

+1

대신'System.getProperty ("java.io.tmpdir"));'를 사용하여 운영 체제에 독립적 인 임시 디렉토리를 가져옵니다. – Joost

+0

좋은 지적! OP는 리눅스 플랫폼을 언급했으나 앞으로 나아가서 대답을 수정하겠습니다. – atomicinf

+0

@atomicinf 정보 주셔서 감사합니다. 잠금 파일에 대해 잘 모르겠다. 제안에 감사 드리며, 좀 더 자세히 살펴보고 코드가 갑자기 종료되면 자체적으로 정리해야한다고 생각하는 해결책을 찾았다. – cardician

0

당신은 JMX 볼과의 JVM을 실행하기위한 쿼리 API를 부착 할 수 링크 -.

또는 Andrew logvinov가 언급 한 것처럼 잠금 파일을 사용합니다.

Java WebStart를 사용하는 경우 이미 기본 지원이 있습니다.

0

많은 프로그램이 PID (종종 "잠금"파일)를 가리키는 임시 파일을 만들어이 문제를 해결합니다. 파일 이름은이 프로세스를 합법적으로 병렬로 실행할 수있는 다른 프로세스와 구별하기 위해 모든 관련 정보를 인코딩해야합니다.

예를 들어, 프로세스가 사용자에게 바인드되면 사용자 이름이 포함되어야합니다. 프로세스가 머신에 바인드되어 있다면 호스트 네임을 포함해야한다 (머신 - 바운드 임시 디렉토리에 넣으면 논쟁의 여지가있다.) 홈 디렉토리에 넣으면 여러 머신의 경우를 생각해 보라. NFS를 통해 홈 공유).

이러한 파일의 위치는 일반적으로/tmp입니다. 시스템 부팅 중에/tmp가 일반적으로 지워지므로 좋은 위치에 있으므로 시스템 충돌시 고아 파일이 남지 않습니다. 일부 프로그램에서 사용하는 또 다른 솔루션은 설정과 관련된 잠금 파일을 사용자 설정 디렉토리에 저장하는 것입니다. 예 : mozilla thunderbird에는 /home/<username>/.thunderbird/<profilename>.default/lock이라는 파일이 있습니다.

파일에는 프로세스의 PID가 포함되어야합니다. 아이디어는 간단합니다 : 파일에 PID가 포함되어 있으면이 프로세스가 실제로 실행 중인지 여부를 쉽게 확인할 수 있습니다. 따라서 프로세스가 충돌하면 파일이 고아가됩니다. 새 프로세스 인스턴스는 파일의 PID를 확인하고 더 이상 실행되지 않는지 확인한 다음 파일을 무시 (덮어 쓰기)합니다.내용에

/tmp/myawesomeservice-username-hostname-lock 

: 보통이`.lock` 파일을 생성하여 수행됩니다

12345 
관련 문제