/Linuxコマンド

プロセスとシステム

プロセスとジョブ

ps・top・kill・jobs・nohup・lsof など、動いているプログラムを調べる・止める・裏で動かすコマンド。

ps動いているプロセスの一覧

今動いているプログラム(プロセス)の一覧を表示します。

bash
$ ps aux                        # 全プロセス(BSD形式)
$ ps -ef                        # 全プロセス(System V形式、親のPIDも見える)
$ ps aux | grep [n]ode
$ ps aux --sort=-%mem | head    # メモリを多く使っている順
$ ps aux --sort=-%cpu | head    # CPUを多く使っている順
$ ps -o pid,ppid,etime,cmd -p 1234   # 表示する項目を指定
列意味
PIDプロセスID
%CPU / %MEMCPU / メモリの使用率
RSS実際に使っているメモリ(KB)
STAT状態(R 実行中、S 待機、Z ゾンビ、T 停止)
TIME使ったCPU時間の合計

topリアルタイムに監視する

CPU やメモリを多く使っているプロセスをリアルタイムに表示します。

bash
$ top
$ top -o %MEM          # メモリ順に並べる
$ top -p 1234          # 特定のプロセスだけ
キー動作
M / Pメモリ順 / CPU順に並べる
kPIDを入れてプロセスを止める
1CPUのコアごとに表示
cコマンドを引数まで表示
q終了

htop見やすい top

Ubuntu には最初から入っていません。 で入れられます。

色付きで、マウスや矢印キーで操作できる top です。F6 で並べ替え、F9 で止める、F4 で絞り込みができます。

killシグナルを送る(止める)

プロセスにシグナルを送って止めます。固まったプログラムの強制終了にも使います。

bash
$ kill 1234              # 終了をお願いする(SIGTERM)
$ kill -9 1234           # 強制終了(SIGKILL)。最後の手段
$ kill -HUP 1234         # 設定を読み直させる(対応しているプログラムのみ)
$ kill %1                # ジョブ番号1を止める
$ kill -l                # シグナルの一覧
シグナル番号意味
SIGTERM15終了のお願い(後片付けしてから終わる)。既定
SIGKILL9強制終了。後片付けはされない
SIGINT2Ctrl+C と同じ
SIGHUP1端末が切れた / 設定の読み直し
SIGSTOP / SIGCONT19 / 18一時停止 / 再開

pkill / pgrep名前でプロセスを探す・止める

名前でプロセスを探したり、まとめて止めたりします。

bash
$ pgrep -a node           # 名前に node を含むプロセスのPIDとコマンド
$ pgrep -u alice -l python
$ pkill -f "vite dev"     # コマンドライン全体に一致するものを止める
$ pkill -9 chrome

killall名前が完全に一致するものをすべて止める

同じ名前のプロセスをすべて止めます。

bash
$ killall firefox
$ killall -i node        # 1つずつ確認

jobs / bg / fgシェルのジョブ操作

端末で動かしているジョブを、裏に回したり前に戻したりします。

bash
$ sleep 100 &            # バックグラウンドで実行
[1] 12345
$ jobs                   # ジョブの一覧
$ fg %1                  # 前に戻す
# (実行中に Ctrl+Z で一時停止)
$ bg                     # 一時停止したジョブをバックグラウンドで再開
$ disown %1              # シェルを閉じても止まらないように切り離す

nohupログアウトしても動かし続ける

端末を閉じても、プログラムを動かし続けます。

bash
$ nohup ./server > server.log 2>&1 &
$ setsid ./long-task.sh >/dev/null 2>&1 &     # 端末から完全に切り離す

nice / renice優先度を変える

プロセスの優先度を変えて、ほかの作業を邪魔しないようにします。

bash
$ nice -n 19 tar czf big.tgz data/     # 優先度を下げて実行(19が最低)
$ sudo renice -n 10 -p 1234            # 実行中のプロセスの優先度を変える

timeかかった時間を測る

コマンドの実行にかかった時間を測ります。

bash
$ time make
real    0m12.345s     # 実際の経過時間
user    0m30.210s     # CPUがユーザー空間で使った時間(コアの合計)
sys     0m2.001s

時間を何度も測って比べたいときは hyperfine が便利です。

timeout時間を区切って実行する

指定した時間を過ぎたらコマンドを止めます。

bash
$ timeout 10s curl https://example.com
$ timeout -k 5 60 ./test.sh      # 60秒で終了をお願いし、さらに5秒で強制終了

watch定期的に実行して表示する

コマンドを数秒ごとに繰り返し実行して、結果の変化を見ます。

bash
$ watch -n 2 'ss -tlnp'          # 2秒ごと
$ watch -d free -h               # 変わったところを強調

lsof開いているファイル・ポートを調べる

どのプロセスがどのファイルやポートを使っているかを調べます。「ポートが使用中」のときの調査に使います。

bash
$ sudo lsof -i :3000             # 3000番ポートを使っているプロセス
$ lsof -p 1234                   # そのプロセスが開いているファイル
$ lsof +D /var/log               # そのディレクトリのファイルを開いているもの
$ sudo lsof | grep deleted       # 消したのに開かれたままのファイル(容量が空かない原因)

fuserファイルやポートを使っているプロセス

ファイルやポートを使っているプロセスを調べたり、止めたりします。

bash
$ fuser -v 8080/tcp
$ fuser -k 8080/tcp              # そのポートを使っているプロセスを止める

pstree親子関係を木で表示する

プロセスの親子関係を木の形で表示します。

bash
$ pstree -p                      # PID付き
$ pstree -p $(pgrep -o code)

pidofプログラム名からPIDを調べる

プログラム名からプロセス ID を調べます。

bash
$ pidof nginx
$ kill -HUP $(pidof -s nginx)     # -s で1つだけ

pmap / pwdxメモリの内訳と作業ディレクトリ

プロセスのメモリの内訳や、どのフォルダで動いているかを調べます。

bash
$ pmap -x 1234 | tail -1          # そのプロセスのメモリの合計
$ pwdx 1234                       # そのプロセスがどこで動いているか

ioniceディスクI/Oの優先度

ディスクの読み書きの優先度を下げて、ほかの作業を邪魔しないようにします。

bash
$ ionice -c3 rsync -a src/ dst/        # ほかが使っていないときだけ読み書きする
$ ionice -c2 -n7 -p 1234               # 動いているプロセスの優先度を下げる

taskset使うCPUを決める

プロセスが使う CPU コアを決めます。

bash
$ taskset -c 0,1 ./bench               # CPU 0 と 1 だけで動かす
$ taskset -cp 1234                     # 今の割り当てを表示

prlimit / ulimit使える資源の上限

開けるファイル数などの上限を確認・変更します。

bash
$ ulimit -a                    # 今のシェルの上限の一覧
$ ulimit -n 65535              # 開けるファイル数の上限を上げる(このシェルだけ)
$ ulimit -c unlimited          # コアダンプを出す
$ prlimit --pid 1234 --nofile  # 動いているプロセスの上限

flock同時に1つしか動かないようにする

cron で動かすスクリプトが重ならないようにするのに便利です。

bash
$ flock -n /tmp/backup.lock ./backup.sh || echo "前回がまだ動いています"
bash
# スクリプトの中で使う形
exec 9>/tmp/myjob.lock
flock -n 9 || exit 1

at決まった時刻に1回だけ実行する

Ubuntu には最初から入っていません。 で入れられます。

決まった時刻に、コマンドを1回だけ実行します。

bash
$ echo "./backup.sh" | at 23:30
$ at now + 10 minutes <<< 'notify-send "10分たちました"'
$ atq                  # 予約の一覧
$ atrm 3               # 予約3を取り消す

screen端末を切り離して動かし続ける

Ubuntu には最初から入っていません。 で入れられます。

tmux と同じ目的の古くからあるツールです。

bash
$ screen -S work       # 名前を付けて開始
# Ctrl+A → D で切り離す
$ screen -ls
$ screen -r work       # つなぎ直す

pvパイプを流れる量と進み具合を表示する

Ubuntu には最初から入っていません。 で入れられます。

パイプを流れるデータの量と進み具合を表示します。

bash
$ pv big.iso > /dev/null
$ pv dump.sql | mysql mydb
$ tar cf - dir/ | pv -s $(du -sb dir | cut -f1) | gzip > dir.tgz

inotifywaitファイルの変更を待ち受ける

Ubuntu には最初から入っていません。 で入れられます。

ファイルやフォルダの変更を待ち受けて知らせます。

bash
$ inotifywait -m -e modify,create,delete ./src    # 変化を表示し続ける
$ while inotifywait -e close_write notes.md; do make; done   # 保存するたびにビルド

entrファイルが変わったらコマンドを実行する

Ubuntu には最初から入っていません。 で入れられます。

ファイルが保存されるたびに、指定したコマンドを自動で実行します。

bash
$ ls *.go | entr -r go run .         # 保存するたびに再起動(-r)
$ find src -name '*.ts' | entr -c npm test   # 画面を消してからテスト

kill のあとも残るとき — ゾンビと D 状態

状態意味対処
Z(ゾンビ)終わっているが親が後片付けしていない親プロセスを止める(ps -o ppid= -p <PID>)
Dディスクやネットワークの応答待ちで止められない原因(マウント先やディスク)を解決する。kill -9 も効かない