プロセスが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

~によるとこの回答、角括弧は、プロセスのパラメータが利用できないことを示します。通常、問題のプロセスはカーネルプロセスであるために発生しますが、ここではそうではありません。私が考えることができる1つの可能性は、引数リストを含むスタックを含むプロセスのメモリが消去されたことです。しかし、プロセスのメモリがカーネルによってクリアされた場合、状態は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これは角かっこ「(...)」を削除し、角かっこ「[...]」で囲んだ後の2番目のフィールドです。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が言ったように、基本的にプロセスは終了しましたが完全に消えませんでした。

さらに、括弧がカーネルスレッドを意味するというもう一つの答えは完全に正確ではありません。カーネルスレッドは、コマンドラインを持たないプロセスの特別なケースです。

関連情報