2010-11-22 4 views
4

시스템에 내 프로그램 사본 하나만 있으면됩니다. 어떻게하면 C 코드로 시스템의 다른 사본을 찾을 수 있습니까? 그와 같은 것을 원합니다.리눅스에서 한 프로그램 만 시작하도록 허용

# program & 
[1] 12586 
# program & 
Program is already running 

내가 가진 가장 좋은 아이디어는 .lock-files를 만드는 것입니다. 그러나 나는 그들에 관한 길드 라인을 찾지 못했습니다.

감사합니다.

+0

데몬으로 프로그램을 실행하고 싶습니다. – Falmarri

+0

관련 스레드 http://stackoverflow.com/questions/3706917/how-to-prevent-a-linux-program-from-running-more-than-once – Naveen

+0

이것은 데몬이 아니지만 비슷한 것입니다. 문제는 동시에 두 개의 사본으로 인해 데이터가 손상 될 수 있다는 것입니다. – Ximik

답변

3

내가 작성한 하나의 데몬은 일반 클라이언트 - 데몬 통신을 위해 UNIX 도메인 소켓을 열었습니다. 그런 다음 다른 인스턴스가 해당 소켓에 연결할 수 있는지 여부를 확인합니다. 가능한 경우 다른 인스턴스가 현재 실행 중입니다. 편집 : @ psmears에서 언급했듯이 경쟁 조건이 있습니다. 다른 인스턴스는 동일한 청취 소켓을 만들려고합니다. 이미 사용 중이면 실패합니다.

잠금 파일은 특수한 경우보다 더 자주 작동합니다. 잘 알려진 위치에 (빈) 파일을 작성한 다음 파일 잠금을 사용하십시오 (예 : fcntl(2)F_SETLKF_GETLK). 해당 파일에 대한 잠금을 설정하거나 잠금이 있는지 여부를 판별하십시오. NFS를 통해 작동하지 않을 수 있습니다. 프로세스가 종료되면 잠금이 해제되므로이 기능이 작동하고 이식성이 있습니다 (적어도 HP-UX 이상). 일부 데몬은 현재 실행중인 다른 인스턴스가 없다고 판단하면 해당 pid를 해당 파일로 덤프하려고합니다.

+3

UNIX 도메인 소켓 아이디어는 좋은 방법이지만 소켓에 연결하는 대신 동일한 이름의 다른 소켓을 만들어야합니다. 주소가 사용 중이 어서 실패하면 디먼이 이미 실행 중입니다. (이 이유는 경쟁 조건을 피하기위한 것입니다. 그렇지 않으면 두 프로세스가 거의 정확히 같은 시간에 시작할 수 있습니다. 둘 다 소켓에 연결하려고 시도합니다. 아직 존재하지 않지만 둘 모두 성공할 것입니다. 소켓을 만들 때 체크/빠져 나오지 않는 한, 둘 다 계속 실행됩니다 - 그런데 왜 여분의 작업을합니까? :-)) – psmears

+0

+1. 좋은 캐치. 필자가 언급 한 코드는 프로덕션 코드이며 실제로 수신 대기 소켓을 만들 수없는 경우 보석금을 부과합니다. – dennycrane

+0

답변 해 주셔서 감사합니다. 그래서 나는 pids를 사용해야 할 것 같습니다. – Ximik

1

이 문제에 대한 매우 일반적인 접근 방식 인 명명 된 sempahores를 사용할 수 있습니다. 프로그램은 semctl()을 호출하여 활성 sempahores가 있는지를 찾은 다음 실행할 수 있는지 확인합니다. 아무 것도 찾지 못하면 뱀파이어를 만듭니다.

OS는 kill -9로 프로세스를 종료하고 sempahores를 종료하는 문제를 처리합니다. 메커니즘이 무엇인지 보려면 해당 컴퓨터의 semctl 및 sem_open에 대한 설명서 페이지를 읽어야합니다.

관련 문제