스크립트 이름으로 실행 중인 스크립트 PID 검색

스크립트 이름으로 실행 중인 스크립트 PID 검색

다음 스크립트가 있습니다

hello.sh
--------
while :
do
    echo "hello"
    sleep 20
done

위 스크립트를 실행하면 스크립트의 PID가 2627이 됩니다.

root@localhost ~]# ./hello.sh &
[1] 2627
[root@localhost ~]#

이제 다른 터미널에서 ps 명령을 실행하면 출력에 스크립트 이름이 표시되지 않습니다.

[root@localhost ~]# ps -ef| grep 262[7]
root      2627  1582  0 19:19 pts/1    00:00:00 -bash
root      3427  2627  0 19:52 pts/1    00:00:00 sleep 20
[root@localhost ~]#

$$는 스크립트를 실행하는 기본 셸의 PID입니다. 나는 스크립트 내에서 $$를 입력하여 스크립트의 PID를 얻을 수 있다는 것을 알고 있지만 그것은 내 의도가 아닙니다.

백그라운드에서 오랫동안 실행되는 스크립트가 있고 실수로 터미널을 닫았다고 가정하면 스크립트 이름이나 다른 방법을 사용하여 PID를 grep하는 방법이 있습니까?

참고로

[root@localhost ~]# echo $$
2586
[root@localhost ~]# ps -ef| grep 262[7]
root      2627  1582  0 19:19 pts/1    00:00:00 -bash
root      3657  2627  0 20:02 pts/1    00:00:00 sleep 20
[root@localhost ~]# ps -ef| grep bas[h]
root      1517  1513  0 18:43 pts/18   00:00:00 -bash
root      1582  1578  0 18:45 pts/1    00:00:00 -bash
root      2586  2581  0 19:18 pts/54   00:00:00 -bash
root      2627  1582  0 19:19 pts/1    00:00:00 -bash
[root@localhost ~]#

2586은 hello.sh 스크립트를 실행한 기본 셸의 PID입니다. 새로운 쉘을 생성하고 그 안에서 명령을 실행하기 시작합니다. 나는 이러한 기본 사항을 알고 있습니다. 이것은 중복된 질문이 아닙니다. 이를 이해하려면 출력을 살펴보십시오.

답변1

스크립트와 해당 이름이 프로세스 목록에 나타나도록 하려면 #! /bin/sh스크립트에 적절한 she-bang 줄( 또는 )을 추가해야 합니다.#! /bin/bash

예:

$ cat foo
sleep 10

$ ./foo &
[4] 4403
$ ps -q 4403
  PID TTY          TIME CMD
 4403 pts/3    00:00:00 bash

$ cat bar
#! /bin/sh
sleep 10

$ ./bar &
[5] 4406
$ ps -q 4406
  PID TTY          TIME CMD
 4406 pts/3    00:00:00 bar

그렇지 않은 경우 Linux에서는 다음 디렉터리에서 스크립트 이름을 찾을 수 있습니다 /proc/PID/fd.

$ ./foo &
[2] 5125
$ ls -l /proc/5125/fd
total 0
lrwx------ 1 ahq ahq 64 Oct 22 17:57 0 -> /dev/pts/3
lrwx------ 1 ahq ahq 64 Oct 22 17:57 1 -> /dev/pts/3
lrwx------ 1 ahq ahq 64 Oct 22 17:57 2 -> /dev/pts/3
lr-x------ 1 ahq ahq 64 Oct 22 17:57 254 -> /tmp/foo
lrwx------ 1 ahq ahq 64 Oct 22 17:57 255 -> /dev/pts/3

네 번째 줄인 254fd는 실행 중인 스크립트의 경로를 가리킵니다. 다른 쉘과 비교하면 이는 또는 와 같은 bash다른 쉘입니다 .fd310

역방향 검색을 수행하는 데에도 사용할 수 있습니다 lsof /tmp/foo.

답변2

Linux에서는 다음을 수행할 수 있습니다.

grep -l hello.sh /proc/*/task/*/comm 2>/dev/null

...명령줄에서 "hello.sh"를 사용하여 모든 프로세스(실행 시 pid 26560)를 보고합니다.

/proc/26560/작업/26560/통신

stderr 리디렉션은 쉘이 와일드카드 경로를 확장하고 grep이 읽기/그레핑을 위해 파일을 열기로 결정하는 시간 사이에 현재 프로세스의 통신 파일(/proc/self/task/$$/comm)이 사라지는 것에 대한 grep의 불만을 제거하는 것입니다.

두 번째 "hello.sh"를 실행하면 두 가지 결과를 얻게 됩니다.

$ ./hello.sh &
[2] 28328
$ grep -l hello.sh /proc/*/task/*/comm 2>/dev/null
/proc/26560/task/26560/comm
/proc/28328/task/28328/comm

관련 정보