암호:
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 파일의 다른 프로그램에 할당될 수 있으므로 이 솔루션에서 문제를 볼 수 있습니다. 물론 완벽한 솔루션은 없습니다. 그러나 이것은 내 원래 질문에서 너무 멀리 떨어져 있습니다.