プロセス管理

Linux プロセス管理(かんり)監視(かんし)

Process vs Thread

Process(プロセス)

  • プログラムの実行(じっこう) インスタンス
  • 独立(どくりつ) したメモリ空間(くうかん)()
  • コード、データ、スタックなどを(ふく)
  • OS が管理(かんり)

Thread(スレッド)

  • プロセス(ない)実行(じっこう) 単位(たんい)
  • プロセスのメモリ空間(くうかん)共有(きょうゆう)
  • より軽量(けいりょう)()() えコストが(ひく)
  • 並列(へいれつ) 実行(じっこう) 可能(かのう)

Process States

プロセスはライフサイクル(ちゅう)(こと) なる状態(じょうたい)経験(けいけん) します:

Running (R)

  • 実行中(じっこうちゅう) または実行(じっこう) ()
  • CPU で実行(じっこう)

Sleeping (S / D)

  • S (Interruptible Sleep) - ()()可能(かのう) なスリープ
    • イベント完了(かんりょう)() つ(I/O など)
    • シグナルで() こせる
  • D (Uninterruptible Sleep) - ()()不可(ふか) なスリープ
    • 通常(つうじょう) は I/O ()
    • シグナルで中断(ちゅうだん) できない

Stopped (T)

  • プロセスが停止(ていし)
  • 通常(つうじょう) Ctrl+Z または SIGSTOP シグナルで発生(はっせい)
  • fg または bg再開(さいかい) 可能(かのう)

Zombie (Z)

  • プロセスは終了(しゅうりょう) したが() クリーンアップ
  • プロセステーブルエントリを占有(せんゆう)
  • (おや) プロセスが終了(しゅうりょう) 状態(じょうたい)()() るのを()

Zombie Process(ゾンビプロセス)

Zombie Process とは?

() プロセスが終了(しゅうりょう) すると、(おや) プロセスが wait() または waitpid()()() して終了(しゅうりょう) 状態(じょうたい)()() るまで zombie 状態(じょうたい) になります。

問題(もんだい) :

  • PID を占有(せんゆう)

  • 大量(たいりょう) の zombie は PID リソースを枯渇(こかつ) させる

  • kill削除(さくじょ) できない

Zombie Process の識別(しきべつ)

# zombie プロセスを確認
ps aux | grep 'Z'

# zombie 数をカウント
ps aux | awk '{if($8=="Z") print}' | wc -l

# zombie の親プロセスを探す
ps -ef | grep defunct

Signals(シグナル)

常用(じょうよう) シグナル

シグナル番号(ばんごう)説明(せつめい)デフォルト動作(どうさ)
SIGHUP1ターミナル切断(せつだん)終了(しゅうりょう)
SIGINT2キーボード()() み (Ctrl+C)終了(しゅうりょう)
SIGKILL9強制(きょうせい) 終了(しゅうりょう)無条件(むじょうけん) 終了(しゅうりょう)
SIGTERM15終了(しゅうりょう) 要求(ようきゅう)グレースフル終了(しゅうりょう)

シグナル送信(そうしん)

# グレースフル終了 (デフォルト SIGTERM)
kill <pid>

# 強制終了
kill -9 <pid>
kill -KILL <pid>

# 設定を再読み込み
kill -HUP <pid>

# 同名のすべてのプロセスを終了
killall process_name

# 名前で検索して終了
pkill process_name

systemd Service Management

サービス管理(かんり)

# サービスを起動
systemctl start service_name

# サービスを停止
systemctl stop service_name

# サービスを再起動
systemctl restart service_name

# 設定を再読み込み
systemctl reload service_name

# 状態を確認
systemctl status service_name

起動(きどう) () 自動(じどう) 起動(きどう)

# 起動時自動起動を有効化
systemctl enable service_name

# 起動時自動起動を無効化
systemctl disable service_name

# 有効化されているか確認
systemctl is-enabled service_name