프로세스 이름은 /usr/bin/python 및 /bin/su에 의해 "마스크"됩니다.

프로세스 이름은 /usr/bin/python 및 /bin/su에 의해 "마스크"됩니다.

pidof스크립트가 아직 실행되고 있지 않은 경우 이 실행 파일이 필요하기 때문에 명령을 사용하여 스크립트가 이미 실행되고 있는지 확인하려고 하는데 pidof명령이 반환되지 않는 것 같습니다.PID출력에 표시된 이름을 사용하는 스크립트의 이름입니다 ps -ef. 대신 이름을 /usr/bin/python또는 로 마스킹합니다 /bin/su. 누군가 무슨 일이 일어나고 있는지, 그리고 pidof 'script.py -v'스크립트가 실행 중인지 확인하기 위해 어떻게 실행할 수 있는지 알려줄 수 있습니까?

[root@cloud proc]# pidof python /some/dir/script.py -v
> pidof: invalid options on command line!

[root@cloud proc]# pidof "python /some/dir/script.py -v"
>

[root@cloud proc]# pidof "su - user -c python /some/dir/script.py -v"
> 

[root@cloud proc]# ps -ef | grep script.py
> root      5409 31739  0 13:07 pts/1    00:00:00 su - user -c python /some/dir/script.py -v
> user      5414  5409 96 13:07 ?        01:00:40 python /some/dir/script.py -v

[root@cloud proc]# ls -l /proc/5409/exe
> lrwxrwxrwx. 1 root root 0 Oct 13 14:04 /proc/5409/exe -> /bin/su

[root@cloud proc]# ls -l /proc/5414/exe
> lrwxrwxrwx. 1 user user 0 Oct 13 14:04 /proc/5414/exe -> /usr/bin/python

[root@cloud proc]# pidof /bin/su
> 31715 6308 5409

[root@cloud proc]# pidof /usr/bin/python
> 5414

답변1

pidof/path/to/script명령과 일치하는 형식을 지정할 수 있는 방법은 없습니다 interpretername /path/to/script. 항상 보인다실행 파일의 파일 이름파일에 나열되어 있습니다 /proc/pid/stat.

그러나 스크립트가 다음으로 끝나는 경우셰르본 #!호출 스크립트를 사용하는 경우 /path/to/script.

대안으로 대부분의 GNU/Linux 시스템은 pgrep명령줄 전체 또는 일부와 일치하는 명령을 제공합니다. 귀하의 예에서는 다음을 사용할 수 있습니다

pgrep -x -f 'python /some/dir/script.py -v'

이는 정확한 명령줄과 일치합니다. 명령줄의 일부를 일치시키려면 다음을 수행할 수 있습니다.

pgrep -x -f 'python /some/dir/script.py .*'

패턴의 시작과 끝 부분에 암시적 위치를 생략할 수 있지만 -x이는 또한 절차와 일치합니다..*su - user -c python /some/dir/script.py -v

귀하의 의견에서 언급했듯이 여러 명령 인스턴스가 동시에 실행되지 않도록 하는 더 좋은 방법은 파일 잠금을 사용하는 것입니다.fcntl.flock.

관련 정보