【ps】PIDを確認する方法。killコマンドなどでプロセス特定に必要です。【Linuxコマンド入門 Part3-4】

「特定のプログラムだけを確認したいのに、top コマンドだと画面が動いてしまって見つけにくい…」 「フリーズしたアプリを強制的に閉じたい!」

そんな時に使うのが、psコマンドです。

  • top: 全体をリアルタイム監視する(動画)
  • ps: その瞬間の状態を切り取る(写真)

この2つを使い分けるのが脱・初心者のポイントです。今回は、Linux管理者が手癖のように打つ「呪文」とともに紹介します。

関連:linux版タスクマネージャー topコマンド

top,htopコマンドの使い方紹介、Linux Ubuntu初学者向けに、よく使うオプションを優先的に紹介しています。

【topとhtop】LinuxでCPUやメモリの使用率をリアルタイムで確認する方法【Linuxコマンド入門 Part3-1】

linux版タスクマネージャー topコマンド、CPUやメモリの使用率を確認し、タスクを管理する方法を紹介します。よく使うショートカットについてまとめました。

psコマンドの使い方紹介、Linux Ubuntu初学者向けに、よく使うオプションを優先的に紹介しています。

ps コマンド

Process Statusの略です。単に ps と打つだけでは、今開いているターミナルの情報しか出ないのであまり意味がありません。

基本構文 ps aux

以下の入力で全プロセスを確認できます。

ps aux

オプションの説明

  • a: すべてのユーザーのプロセスを表示
  • u: ユーザー名や開始時刻など、詳細を表示
  • x: ターミナルで実行されていないプロセス(バックグラウンドで動くサーバー機能など)も表示

豆知識: 「aux(オックス)」と覚える人が多いです。ハイフン(-)は付けなくても動きます(BSD由来の書き方ですが、Linuxの標準になっています)。

実行結果の見方

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 168468 13456 ?        Ss   Dec01   0:05 /sbin/init
lumen     1234  0.5  2.0 856420 56200 ?        Sl   10:00   0:15 /usr/bin/python3 app.py

見るべきポイントは3つだけです。

  1. USER: 誰が実行しているか。
  2. PID (Process ID): プロセスの背番号。(※あとで使います!)
  3. COMMAND: 実行されているコマンドの中身。

grepで絞り込みする

実行中のプロセスは何百個もあるので、ps aux だけだと長すぎて探すのが大変です。 そこで、第2回シリーズまでで学んだ 「パイプ |」と「grep」 を組み合わせます。

例えば、「python」で動いているプログラムだけを探したい時はこう打ちます。

ps aux | grep python

解説: ps auxで全プロセスを標準出力し、”|”(pipe)で次のコマンドに受け渡し、grep pythonでパイソンの文字列がある行のみを絞り込みターミナルに出力

|(pipe)grepの詳細が知りたいときはこちら

linuxコマンド入門、コマンドの出力を次のコマンドに受け渡す "|" パイプの使い方について紹介。

【 | 】コマンドを繋げる「パイプ」~ | の使い方~【続・Linuxコマンド入門 #2】

コマンドを繋げる「パイプ (|)」入門!あるコマンドの結果を、ls | grep のように次のコマンドへ直接渡す仕組みを、初心者向けにわかりやすく解説します。

grepコマンドの使い方紹介、Linux Ubuntu初学者向けに、よく使うオプションを優先的に紹介しています。

【初心者向け】grepコマンド「ファイル内から文字列検索」- 特定の行だけ抜き出す -【Linuxコマンド入門 #17】

Linuxのgrepコマンド。ログや設定ファイルから特定の「文字列」を検索する方法を解説。-i(大文字小文字無視)、-n(行番号)、-r(再帰)オプションやパイプ(|)との連携も紹介。

便利なオプションと組み合わせ集

–sort [項目名]でソートして表示する

–sort [項目名]でソートできます。メモリでソートして、出力をheadで上位だけ表示すれば、メモリの使用量が多いものを確認できます。

メモリ使用量上位6つを表示する

ps aux --sort -%mem | head -n 6

CPU使用量上位6つを表示する

ps aux --sort -%cpu | head -n 6

-f (forest)ツリー表示で親子関係を確認

プロセスは単独で動いているとは限りません。親プロセスが子プロセスを呼び出している場合、その関係性が見えるとトラブルシューティングが楽になります。

実行例

ps auxf
# または
ps -aux -f 

tree表示出力結果例

fオプションをつけると、親プロセスがあるときは、以下の様なASCIIアート風に階層表示してくれます。

# 長いので一部省略
root           2   /init
root           6    \_ plan9 --control-socket 7 --log-level 4 --server-f
root         291    \_ /init
root         293    |   \_ /init
data         295    |       \_ -bash
data         482    |           \_ ps auxf
root         299    \_ /bin/login -f
data         392        \_ -bash

-L スレッド単位で確認

プロセスは単独のスレッドではなく、複数のスレッドを起動して動作していることがあります。Pythonなどの開発中で非同期処理をしたいときなどに多いです。

そこでスレッド単位で見たいときは -Lオプションをつけます。

スレッド単位で見るのは、詳細を確認したい時なので、-p [PID]で確認したいプロセスを指定して詳細確認します。(指定しないとめちゃくちゃ長い出力が出て見ずらいです。)

実行例

ps -L -p [PID]

結果の例

動作チェックのために、サブプロセスを3つ持つ簡易的なデモpythonプログラムを作りました。

サブプロセス実験用pythonプログラム

待機してループするだけのダミープロセスを3つ持つpythonプログラムです。

nano dummy.py などでファイル作成し、以下をコピペし作成すれば確認できます。

import threading
import time

def worker():
    # 軽い処理をループ
    while True:
        time.sleep(1)

def main():
    threads = []
    for i in range(3):  # 3つの子スレッド
        t = threading.Thread(target=worker)
        t.daemon = True   # メイン終了で終了してOK
        t.start()
        threads.append(t)

    # メインスレッドも生存させる
    while True:
        time.sleep(10)

if __name__ == "__main__":
    main()

実行は、以下のコードでできます。 &は、実行後も別途terminal入力できるように(スレッド分離)するために付けています。

python3 dummy.py &

実行結果

先ほど実行したpythonプログラムを例に、PID確認、スレッドの詳細確認の手順を行ってみます。

PIDを確認する

dummy.pyを実行後、ps 単体でpythonのPIDを確認。(実行の度に変わるので都度チェック)

ps 

# 実行したら以下の様な感じに表示される。わかりずらかったら grepで絞り込んでもよいです。
#  PID TTY          TIME CMD
#  295 pts/0    00:00:00 bash
#  610 pts/0    00:00:00 python3
#  655 pts/0    00:00:00 ps

python3のPIDは “610“であることが確認できました。

PIDを指定してスレッドの詳細を見る。

ps -L -p [pythonのPID]で詳細確認できるので、スレッド別の詳細を見てみます。

ps -L -p 610

#   PID     LWP TTY          TIME CMD
#   610     610 pts/0    00:00:00 python3
#   610     611 pts/0    00:00:00 python3
#   610     612 pts/0    00:00:00 python3
#   610     613 pts/0    00:00:00 python3

結果の見方

親プロセスがPID 610で、その子であるスレッド(LWP)が 610 ,611,612,613とあることが確認できます。

LWP (Light Weight Process): スレッドのこと、linuxだとスレッドを軽量プロセスという表現で表す。

PIDとLWP(スレッド番号)を見ると、以下のことわかります。

  • 610 (1行目): PIDと同じ ですね。つまり、これが 「メインスレッド(親玉)」 です。
  • 611から613(2から4行目):Pythonプログラムによって生成された 「3つの子スレッド」 です。

TIME:実際にそのプロセスがCPUを使って計算した時間のことです。サンプルは待機してループするだけなので0秒になっています。

 プロセスからより詳細のスレッド別でみることができると、過去の実行で残ってるバグやスタックして正常な処理を阻害しているスレッドなどを確認することができます。

また、計算しているスレッドとスリープしているスレッドの確認などもできます。

まとめ

  • ps : プロセスの確認ができるコマンド
  • ps aux : 全プロセスを確認できるオプション
  • ps aux –sort [項目名] : 項目でソートして出力する。
  • ps -f : スレッドの親子関係をツリー表示
  • ps -L : スレッド(LWP)単位で表示する。

psコマンドで、プロセス別に詳細を確認することができるようになりました。

次回は、psコマンドで調べることができる PIDを用いてプロセスをタスクキルするkillコマンドについて紹介します。

killコマンドの使い方紹介、Linux Ubuntu初学者向けに、よく使うオプションを優先的に紹介しています。

【kill】プロセスを安全かつ速やかに終了させる方法 killのシグナルを理解する【Linuxコマンド入門 Part3-5】

プロセスを終了させるkillコマンドについて使い方を紹介。また、実際の動作(シグナルの送信)、よく使うオプションと便利な使い方について詳しく紹介。コピペできる使用例付き。

uptimeと組み合わせると便利な | (pipe)とgrepについてオプションなど詳しく知りたいときはこちら

linuxコマンド入門、コマンドの出力を次のコマンドに受け渡す "|" パイプの使い方について紹介。

【 | 】コマンドを繋げる「パイプ」~ | の使い方~【続・Linuxコマンド入門 #2】

コマンドを繋げる「パイプ (|)」入門!あるコマンドの結果を、ls | grep のように次のコマンドへ直接渡す仕組みを、初心者向けにわかりやすく解説します。

grepコマンドの使い方紹介、Linux Ubuntu初学者向けに、よく使うオプションを優先的に紹介しています。

【初心者向け】grepコマンド「ファイル内から文字列検索」- 特定の行だけ抜き出す -【Linuxコマンド入門 #17】

Linuxのgrepコマンド。ログや設定ファイルから特定の「文字列」を検索する方法を解説。-i(大文字小文字無視)、-n(行番号)、-r(再帰)オプションやパイプ(|)との連携も紹介。

第三回”Linuxコマンド入門 Part3 ~システムの状態確認とネットワークの基本~”では、linuxでどのようにCPUやメモリの状態を確認するか、ネットワークとの接続チェックなどの基本操作を解説しています。

linuxコマンドでシステムのメモリやCPUの状態、プロセスの詳細を確認する方法を紹介するシリーズのサムネイル 6 記事
シリーズ

Linuxコマンド入門 Part3 ~システムの状態確認とネットワークの基本~

Linuxのシステム管理コマンドや基本的なネットワーク関係コマンドを理解しよう。

ここまで読んでいただきありがとうございます。

では、次の記事で。 lumenHero