내 소프트웨어의 두 번째 인스턴스가 시작되지 않도록 방지

내 소프트웨어의 두 번째 인스턴스가 시작되지 않도록 방지

시작 시 특정 소프트웨어를 실행하기 위한 서비스 스크립트를 작성했습니다. 더 이상 수동으로 실행할 수 없도록 소프트웨어를 제한하려면 어떻게 해야 합니까?

내 말은 소프트웨어가 메모리에 하나의 인스턴스만 가질 수 있다는 것입니다.

나는 내 소프트웨어의 소스 코드를 변경하고 싶지 않고 이것이 나를 위해 초기화되기를 원합니다.

답변1

이것은 bash 스크립트에서 작동합니다. 외부 소프트웨어의 다른 인스턴스가 발견되면 스크립트 실행이 중단됩니다. 여기서 핵심은 `pidof'이다.

#!/bin/bash

# Abort startup if another instance was found    
pidof /path/to/software.executable > /dev/null && {
  echo Sorry. Only one instance allowed.
  exit
}

또는 잠금 파일을 사용하여 실행 중인 인스턴스를 교체할 수 있습니다(즉, 먼저 실행 중인 인스턴스를 종료한 다음 실행을 허용합니다).

그러나 전문가 사용자는 이 스크립트를 우회하고 외부 명령을 직접 호출할 수 있습니다.

답변2

init에게 소프트웨어 인스턴스를 하나만 실행하도록 지시할 수 있습니다. 실제로 이는 init에서 소프트웨어를 시작하면 자연스럽게 발생합니다. 그러나 init의 작업은 다른 프로그램이 소프트웨어의 다른 인스턴스를 시작하는 것을 방지하는 것과는 아무런 관련이 없습니다.

프로그램의 인스턴스 하나만 실행되도록 하려면 프로그램을 직접 실행하는 대신 소프트웨어가 이미 실행 중인지 확인하는 래퍼 스크립트를 실행하세요.LatinSuD의 답변이러한 래퍼 스크립트의 예가 제공됩니다.

물론 사용자는 래퍼 스크립트를 우회하고 소프트웨어의 다른 인스턴스를 실행할 수 있습니다. 그러나 사용자는 귀하와 똑같은 실행 파일을 만들어 실행할 수도 있습니다. 따라서 원하는 제한 사항은 실제로 래퍼 스크립트를 통해 의미 있는 방식으로 구현됩니다.

동일한 실행 파일의 여러 인스턴스를 실행하는 것 자체는 문제가 되지 않습니다. 문제가 발생할 수 있는 곳은 파일, 네트워크 포트 등 동일한 리소스에 액세스하는 경우입니다. 동일한 리소스에 대한 동시 액세스를 방지해야 하는 경우 가능한 접근 방식은 리소스가 무엇인지에 따라 다릅니다. 리소스가 TCP 또는 UDP 포트인 경우 어쨌든 하나의 프로세스만 해당 포트에서 수신 대기할 수 있습니다. 리소스가 파일인 경우 init 스크립트에 의해 시작된 인스턴스를 실행하는 사용자만 파일에 액세스할 수 있는지 확인하십시오.

답변3

오래된 스레드이지만 여기에 몇 가지 메모를 작성할 가치가 있습니다. "/bin/bash /tmp/my_script.sh" 또는 "python my_script.py"와 같은 상위 프로세스에서 프로세스를 실행하는 경우 다음을 사용하세요.

pgrep -l my_script.sh >/dev/null && echo "Another process is running" || { 
do your stuff;
}

답변4

실제로 올바른 권한이 있는 사용자 액세스를 거부하고 루트(유사) 사용자만 소프트웨어를 실행하도록 허용하는 것이 현명할 것입니다.

관련 정보