프로세스가 SIGKILL이면 이름 주위에 대괄호([])가 나타납니다.

프로세스가 SIGKILL이면 이름 주위에 대괄호([])가 나타납니다.

다음과 같은 프로세스를 실행하고 종료하고 있습니다.

python some_script.py &; pid=$!; sleep 5; kill -9 $!; ps -o pid,sid,uid,state,start,command

즉, 백그라운드에서 스크립트를 실행하고 해당 프로세스 ID를 기록하고 5초 동안 대기한 후 SIGKILL로 종료하고 마지막으로 프로세스 목록을 표시합니다. 스크립트 자체는 메모리를 많이 사용합니다. 소스 코드는 질문 끝에 포함되어 있습니다.

의 출력은 ps다음과 같습니다

   PID    SID      UID S  STARTED COMMAND
 72014  73317 22563342 R 20:56:36 [python]
<... other processes>

다음으로 프로세스가 성공적으로 종료되었는지 확인합니다.

[1]  + killed     python some_script.py

내 질문:Python 프로세스가 이름 주위에 대괄호를 표시하는 이유는 무엇입니까 ps?

~에 따르면이 답변, 대괄호는 프로세스의 매개변수를 사용할 수 없음을 나타냅니다. 일반적으로 문제의 프로세스가 커널 프로세스이기 때문에 발생하지만 여기서는 그렇지 않습니다. 내가 생각할 수 있는 한 가지 가능성은 인수 목록이 포함된 스택을 포함하여 프로세스의 메모리가 지워졌다는 것입니다. 그러나 프로세스의 메모리가 커널에 의해 지워지면 상태가 RUNNING이 아닌 DYING 또는 ZOMBIE가 되어야 하지 않나요?


소스 코드 some_script.py:

import asyncio


async def create_tasks(n_tasks):
    tasks = [task() for _ in range(n_tasks)]
    await asyncio.gather(*tasks)


async def task():
    await asyncio.sleep(10)


if __name__ == "__main__":
    asyncio.run(create_tasks(1000000))

답변1

짧은 대답은 ps매뉴얼 페이지에 있습니다.

프로세스 매개변수를 사용할 수 없는 경우도 있습니다. 이 경우 ps는 실행 파일 이름을 괄호 안에 인쇄합니다.

이는 procps 라이브러리가 읽기를 시도 /proc/<PID>/cmdline하고 비어 있으면 인쇄함을 의미합니다.명령 이름/proc/<PID/stat이는 대괄호 "(...)"를 제거하고 대괄호 "[...]"로 묶은 후의 두 번째 필드입니다. pscomm분야 이기 때문입니다 .

명령줄을 약간 변경합니다.

$ python3 some_script.py &  pid=$!; sleep 5; kill -9 $!; echo CMDLINE BELOW ; cat -e /proc/${pid}/cmdline ; echo COMM BELOW ; cut -f 2 -d' ' /proc/${pid}/stat ; echo PS BELOW ; ps -o pid,sid,uid,state,start,comm,command ${pid}
[1] 62187
CMDLINE BELOW
COMM BELOW
(python3)
PS BELOW
    PID     SID   UID S  STARTED COMMAND         COMMAND
  62187   21814  1000 R 16:37:49 python3         [python3]

인수를 사용할 수 없는 이유에 대해 @muru가 말했듯이 기본적으로 프로세스가 종료되었지만 완전히 사라지지는 않았음을 알 수 있습니다.

또한 괄호가 커널 스레드를 의미한다는 또 다른 대답은 완전히 정확하지 않습니다. 커널 스레드는 명령줄이 없는 프로세스의 특별한 경우입니다.

관련 정보