다음과 같은 프로세스를 실행하고 종료하고 있습니다.
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
이는 대괄호 "(...)"를 제거하고 대괄호 "[...]"로 묶은 후의 두 번째 필드입니다. ps
이 comm
분야 이기 때문입니다 .
명령줄을 약간 변경합니다.
$ 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가 말했듯이 기본적으로 프로세스가 종료되었지만 완전히 사라지지는 않았음을 알 수 있습니다.
또한 괄호가 커널 스레드를 의미한다는 또 다른 대답은 완전히 정확하지 않습니다. 커널 스레드는 명령줄이 없는 프로세스의 특별한 경우입니다.