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"
이는 귀하 sed
와 grep
선을 구분하는 공백을 지원한다고 가정합니다. 스크립트 이름이 될 sed
해당 파일(매개변수 1)의 두 번째 줄을 인쇄합니다 . 그런 다음 스크립트 이름과 정확히 일치하는 항목을 찾으세요. 에서 전체 게임을 완료할 수 있지만 따옴표를 가지고 장난을 치고 싶지는 않습니다.cmdline
grep
sed
다른 경로를 통해 스크립트를 호출하면 실패합니다.
/home/user/myscript
cd /home; usr/myscript
myscript
그러나 스크립트 이름의 공백은 안전해야 합니다.