![プロセスがSIGKILLの場合、名前の周りに角括弧([])が表示されます。](https://linux33.com/image/226633/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%8CSIGKILL%E3%81%AE%E5%A0%B4%E5%90%88%E3%80%81%E5%90%8D%E5%89%8D%E3%81%AE%E5%91%A8%E3%82%8A%E3%81%AB%E8%A7%92%E6%8B%AC%E5%BC%A7%EF%BC%88%5B%5D%EF%BC%89%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82.png)
次のプロセスを実行して終了しています。
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が言ったように、基本的にプロセスは終了しましたが完全に消えませんでした。
さらに、括弧がカーネルスレッドを意味するというもう一つの答えは完全に正確ではありません。カーネルスレッドは、コマンドラインを持たないプロセスの特別なケースです。