#!/usr/bin/env 사용 시 스크립트가 실행 중인지 확인하세요.

#!/usr/bin/env 사용 시 스크립트가 실행 중인지 확인하세요.

bash 스크립트의 shebang을 에서 로 마이그레이션하려고 하는데 #!/bin/bash#!/usr/bin/env bash코드를 사용하여 실행 중인 기존 인스턴스를 확인하기 때문에 일부가 손상되었으며 다음에서만 작동합니다 #!/bin/bash.

$ pidof -x myscript -o %PPID

제가 알고 싶은 것은 호출된 스크립트가 env실행 중인지 확실하게 확인하는 방법입니다. 제가 시도한 대부분의 솔루션에는 더러운 정규 표현식이 포함되어 있고 여전히 신뢰할 수 없기 때문입니다.

$ pgrep -f '(^|/)myscript(\s|$)'

내 스크립트의 경로를 고려하면 /home/user/myscript위 코드는 다음과 같은 원치 않는 명령의 PID를 반환할 수 있습니다.

editor /home/user/myscript
bash /tmp/myscript
bash /home/user/myscript with spaces

답변1

Linux에서는 pgrep가능한 의심의 PID를 가져오고 해당 PID의 첫 번째 매개변수를 확인할 수 있습니다(참고자료에 제공됨 /proc/$PID/cmdline). ASCII NUL( )로 구분된 /proc/$PID/cmdline프로세스의 모든 매개변수(매개변수 0 포함)를 포함합니다 .\0

그것은 다음과 같습니다:

pgrep bash | xargs -I {} sed -nz '2{p; q}' /proc/{}/cmdline | grep -Fqzx "$0"

이는 귀하 sedgrep선을 구분하는 공백을 지원한다고 가정합니다. 스크립트 이름이 될 sed해당 파일(매개변수 1)의 두 번째 줄을 인쇄합니다 . 그런 다음 스크립트 이름과 정확히 일치하는 항목을 찾으세요. 에서 전체 게임을 완료할 수 있지만 따옴표를 가지고 장난을 치고 싶지는 않습니다.cmdlinegrepsed

다른 경로를 통해 스크립트를 호출하면 실패합니다.

/home/user/myscript
cd /home; usr/myscript
myscript

그러나 스크립트 이름의 공백은 안전해야 합니다.

관련 정보