스크립트 인스턴스가 하나만 실행되고 있는지 확인하시겠습니까?

스크립트 인스턴스가 하나만 실행되고 있는지 확인하시겠습니까?

암호:

if [[ "`pidof -x $(basename $0) -o %PPID`" ]]; then exit; fi

원래 코드 소스:https://forum.rclone.org/t/continuous-syncing/12377/2

bash 스크립트의 이 코드가 어떻게 bash 스크립트의 인스턴스 하나만 실행되도록 보장하는지 이해가 되지 않습니다.

스크립트의 프로세스 ID를 검색하는 부분은 이해 하지만 해당 부분의 목적을 pidof -x $(basename $0)이해하지 못합니다 .-o %PPID

질문: 코드가 어떻게 작동하는지 아는 사람이 있나요?

답변1

~에 따르면매뉴얼 페이지놓쳤어요 pidof(알려준 @cas에게 감사드립니다):

-o omitpid
          Tells pidof to omit processes with that process id. The
          special pid %PPID can be used to name the parent process
          of the pidof program, in other words the calling shell or
          shell script.

따라서 -o %PPID현재 실행 중인 스크립트를 무시하고 해당 스크립트의 다른 인스턴스(있는 경우)의 PID를 검색하는 것을 의미합니다.

명령 대체를 위해 백틱과 $()를 혼합하지 않고도 원본 코드를 다시 작성할 수 있습니다.

#!/bin/bash

# ensure only one instance of script is running
if pidof -x $(basename $0) -o %PPID > /dev/null
then
    exit
fi

고쳐 쓰다:@Alfe가 지적했듯이: " 어쨌든 pidof기반을 사용하는 basename $0것은 이 검사를 수행하는 안전하지 않은 방법입니다. 완전히 다른 두 프로그램이 동일한 기본 이름을 가질 수 있습니다...". 다음은 pid 파일을 사용하는 @Alfe 주석을 기반으로 한 또 다른 솔루션입니다.

#!/usr/bin/env bash

set -e

pid_file="fixed_name.pid"

# ensure only one instance of script is running
if [ -f "$pid_file" ] && ps -p $(cat "$pid_file") > /dev/null
then
    # another instance of this script is running
    exit
fi

# write script's PID to pid-file
printf "$$" > "$pid_file"

# do some work

유효한 PID가 오래된 PID 파일의 다른 프로그램에 할당될 수 있으므로 이 솔루션에서 문제를 볼 수 있습니다. 물론 완벽한 솔루션은 없습니다. 그러나 이것은 내 원래 질문에서 너무 멀리 떨어져 있습니다.

관련 정보