2010-05-04 2 views
2

한 번에 두 번 이상 호출되지 않도록 랩핑해야하는 실행 파일 (소스 없음)이 있습니다. 나는 일종의 대기열 래퍼 (queue wrapper)를 즉시 생각해 보았습니다.하지만 어떻게하면 실제로 래퍼가 실행 파일 자체 대신 호출되도록 만들 수 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 사용자가 다른 응용 프로그램이기 때문에 솔루션을 보이지 않아야합니다. 모든 정보/권장 사항은 높이 평가됩니다.UNIX (SunOS)에서 실행 파일을 한 번에 두 번 이상 실행하지 못하게하려면 어떻게해야합니까?

+0

정말 고마워요! 이 솔루션에 대해 생각하면 시간이 좀 걸렸을 것입니다! –

답변

1

방법 1 : 표준 경로가 아닌 위치에 실행 파일을 넣습니다. 센티널 파일을 검사하는 쉘 스크립트를 작성하고, 센티넬 파일이 없으면 프로그램을 실행하고 ptogram이 완료되기를 기다린 다음 센티넬 파일을 삭제합니다. 센티널 파일이 있으면 스크립트는 짧은 지연 (1 초,이 프로그램의 표준 실행 시간은 얼마나 걸리나요?)과 반대로 루프를 입력하고, 문장 파일을 다시 확인합니다.

방법 2 : 스크립트와 동일한 작업을 수행하지만 시스템 수준의 세마포 또는 잠금을 대신 사용하는 별도의 프로그램을 만듭니다. 파일에 읽기/쓰기 잠금을 간단하게 사용할 수도 있습니다. 프로그램은 실제 프로그램에서 fork() 및 exec()를 수행하여 감시 카메라를 지우기 전에 자식 종료를 기다립니다.

+0

신중하게 구현하지 않으면 두 방법 모두 경쟁 조건이 발생할 수 있습니다 (예를 들어, 두 프로세스가 존재하지 않는 센티널 파일을 검사하고 찾은 다음 두 프로세스가 모두 작성하려고하는 경우). 조심스럽게 알려진 위치에 디렉토리를 만드는 것과 같은 원자 적 작업을 선택하고 작업이 성공하는지 확인하십시오. –

+0

동의합니다. 개인적으로 옵션 2를 선호합니다. 디렉토리를 만들려고하면 예외를 트랩하고 대기 루프로 돌아갈 수 있습니다. 이것은 옵션 1에서 가능하지 않습니다. 옵션 1의 장점은 구현하기 위해 많은 작업을 할 필요가 없다는 것입니다. 아, 그리고/tmp에 파일을 사용하지 마십시오. 안전한 장소에 두십시오. – jfawcett

1

사용자가 다른 애플리케이션 인 경우 실행 파일 (예 : name -> name.real)의 이름을 바꾸고 원래 이름으로 래퍼를 호출 할 수 있습니다. 한 번에 한 번만 호출되도록하려면 pidof 명령 (예 : pidof name.real)을 사용하여 프로그램이 이미 실행 중인지 확인하십시오. (pidof은 실제로 실행중인 프로세스의 PID를 제공하므로 다음과 같은 항목을 사용할 수 있습니다. kill 또는 신호를 보내려면 무엇이든).