프로그램이 이미 실행 중이고 특정 파일이 열려 있는 경우 프로그램이 시작되지 않도록 방지

프로그램이 이미 실행 중이고 특정 파일이 열려 있는 경우 프로그램이 시작되지 않도록 방지

a_command myfile쌍을 하나의 인스턴스로만 제한 해야 합니다 .

  • 내 특별한 경우에는
    qemu-system-x86_64 [options] -drive file=myfile.img,format=raw
    
  • 스크립트는 둘 다 qemu-system-x86_64실행 중인지 확인해야 합니다.그리고파일이 myfile.img열려 있습니다. myfile.imgrw-open이라면 어떤 프로그램도 실행되지 않게 하는 것이 더 안전할 것 같습니다 .

어떻게 해야 하나요?

답변1

Stephen Kitt는 주석에서 이것이 처음에는 필요하지 않을 수 있다고 지적했지만, pidof및 를 결합하여 특정 바이너리가 실행 중인지, 특정 파일이 열려 있는지 확인할 수 있습니다 lsof.

  • pidof인수로 주어진 프로그램을 실행하는 프로세스의 PID를 찾습니다. 하나 이상의 인스턴스가 발견되면 "true"를 반환하고, 그렇지 않으면 "false"를 반환합니다. 출력은 여기서 관련이 없으며 리디렉션에 의해 억제됩니다./dev/null
  • lsof특정 파일을 여는 모든 프로그램이 나열됩니다. 하나 이상의 프로그램에 열린 파일 설명자가 있으면 "true"를 반환하고, 그렇지 않으면 "false"를 반환합니다.

간단한 확인은 다음과 같습니다.

#!/bin/bash

# Check if program is running and image file open. If yes, then exit right away.
if pidof qemu-system-x86_64 >/dev/null && lsof myfile.img >/dev/null
then
    printf -- "An instance of qemu is running and file 'myfile.img' is open. Exiting!\n"
    exit 1
fi

# If at least one is not the case, execute your code here

보다 복잡한 설정에서는 실제로 qemu-system-x86_64자신의 설정이 열리는 지 확인할 수 있습니다 myfile.img.

if lsof myfile.img | grep -q '^qemu-system-x86_64'
then
    printf -- "File 'myfile.img' is opened by program 'qemu-system-x86_64'. Exiting!"
    exit 1
fi

grep프로그램 이름이 출력 줄의 첫 번째 항목인지 확인하려면 프로그램 이름에 RegEx 관련 문자가 포함되어 있지 않아야 합니다 .

관련 정보