プロセスとシステム
プロセスとジョブ
ps・top・kill・jobs・nohup・lsof など、動いているプログラムを調べる・止める・裏で動かすコマンド。
ps動いているプロセスの一覧
今動いているプログラム(プロセス)の一覧を表示します。
$ 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 / %MEM | CPU / メモリの使用率 |
RSS | 実際に使っているメモリ(KB) |
STAT | 状態(R 実行中、S 待機、Z ゾンビ、T 停止) |
TIME | 使ったCPU時間の合計 |
topリアルタイムに監視する
CPU やメモリを多く使っているプロセスをリアルタイムに表示します。
$ top
$ top -o %MEM # メモリ順に並べる
$ top -p 1234 # 特定のプロセスだけ| キー | 動作 |
|---|---|
| M / P | メモリ順 / CPU順に並べる |
| k | PIDを入れてプロセスを止める |
| 1 | CPUのコアごとに表示 |
| c | コマンドを引数まで表示 |
| q | 終了 |
htop見やすい top
Ubuntu には最初から入っていません。 で入れられます。
色付きで、マウスや矢印キーで操作できる top です。F6 で並べ替え、F9 で止める、F4 で絞り込みができます。
killシグナルを送る(止める)
プロセスにシグナルを送って止めます。固まったプログラムの強制終了にも使います。
$ kill 1234 # 終了をお願いする(SIGTERM)
$ kill -9 1234 # 強制終了(SIGKILL)。最後の手段
$ kill -HUP 1234 # 設定を読み直させる(対応しているプログラムのみ)
$ kill %1 # ジョブ番号1を止める
$ kill -l # シグナルの一覧| シグナル | 番号 | 意味 |
|---|---|---|
SIGTERM | 15 | 終了のお願い(後片付けしてから終わる)。既定 |
SIGKILL | 9 | 強制終了。後片付けはされない |
SIGINT | 2 | Ctrl+C と同じ |
SIGHUP | 1 | 端末が切れた / 設定の読み直し |
SIGSTOP / SIGCONT | 19 / 18 | 一時停止 / 再開 |
pkill / pgrep名前でプロセスを探す・止める
名前でプロセスを探したり、まとめて止めたりします。
$ pgrep -a node # 名前に node を含むプロセスのPIDとコマンド
$ pgrep -u alice -l python
$ pkill -f "vite dev" # コマンドライン全体に一致するものを止める
$ pkill -9 chromekillall名前が完全に一致するものをすべて止める
同じ名前のプロセスをすべて止めます。
$ killall firefox
$ killall -i node # 1つずつ確認jobs / bg / fgシェルのジョブ操作
端末で動かしているジョブを、裏に回したり前に戻したりします。
$ sleep 100 & # バックグラウンドで実行
[1] 12345
$ jobs # ジョブの一覧
$ fg %1 # 前に戻す
# (実行中に Ctrl+Z で一時停止)
$ bg # 一時停止したジョブをバックグラウンドで再開
$ disown %1 # シェルを閉じても止まらないように切り離すnohupログアウトしても動かし続ける
端末を閉じても、プログラムを動かし続けます。
$ nohup ./server > server.log 2>&1 &
$ setsid ./long-task.sh >/dev/null 2>&1 & # 端末から完全に切り離すnice / renice優先度を変える
プロセスの優先度を変えて、ほかの作業を邪魔しないようにします。
$ nice -n 19 tar czf big.tgz data/ # 優先度を下げて実行(19が最低)
$ sudo renice -n 10 -p 1234 # 実行中のプロセスの優先度を変えるtimeかかった時間を測る
コマンドの実行にかかった時間を測ります。
$ time make
real 0m12.345s # 実際の経過時間
user 0m30.210s # CPUがユーザー空間で使った時間(コアの合計)
sys 0m2.001s時間を何度も測って比べたいときは hyperfine が便利です。
timeout時間を区切って実行する
指定した時間を過ぎたらコマンドを止めます。
$ timeout 10s curl https://example.com
$ timeout -k 5 60 ./test.sh # 60秒で終了をお願いし、さらに5秒で強制終了watch定期的に実行して表示する
コマンドを数秒ごとに繰り返し実行して、結果の変化を見ます。
$ watch -n 2 'ss -tlnp' # 2秒ごと
$ watch -d free -h # 変わったところを強調lsof開いているファイル・ポートを調べる
どのプロセスがどのファイルやポートを使っているかを調べます。「ポートが使用中」のときの調査に使います。
$ sudo lsof -i :3000 # 3000番ポートを使っているプロセス
$ lsof -p 1234 # そのプロセスが開いているファイル
$ lsof +D /var/log # そのディレクトリのファイルを開いているもの
$ sudo lsof | grep deleted # 消したのに開かれたままのファイル(容量が空かない原因)fuserファイルやポートを使っているプロセス
ファイルやポートを使っているプロセスを調べたり、止めたりします。
$ fuser -v 8080/tcp
$ fuser -k 8080/tcp # そのポートを使っているプロセスを止めるpstree親子関係を木で表示する
プロセスの親子関係を木の形で表示します。
$ pstree -p # PID付き
$ pstree -p $(pgrep -o code)pidofプログラム名からPIDを調べる
プログラム名からプロセス ID を調べます。
$ pidof nginx
$ kill -HUP $(pidof -s nginx) # -s で1つだけpmap / pwdxメモリの内訳と作業ディレクトリ
プロセスのメモリの内訳や、どのフォルダで動いているかを調べます。
$ pmap -x 1234 | tail -1 # そのプロセスのメモリの合計
$ pwdx 1234 # そのプロセスがどこで動いているかioniceディスクI/Oの優先度
ディスクの読み書きの優先度を下げて、ほかの作業を邪魔しないようにします。
$ ionice -c3 rsync -a src/ dst/ # ほかが使っていないときだけ読み書きする
$ ionice -c2 -n7 -p 1234 # 動いているプロセスの優先度を下げるtaskset使うCPUを決める
プロセスが使う CPU コアを決めます。
$ taskset -c 0,1 ./bench # CPU 0 と 1 だけで動かす
$ taskset -cp 1234 # 今の割り当てを表示prlimit / ulimit使える資源の上限
開けるファイル数などの上限を確認・変更します。
$ ulimit -a # 今のシェルの上限の一覧
$ ulimit -n 65535 # 開けるファイル数の上限を上げる(このシェルだけ)
$ ulimit -c unlimited # コアダンプを出す
$ prlimit --pid 1234 --nofile # 動いているプロセスの上限flock同時に1つしか動かないようにする
cron で動かすスクリプトが重ならないようにするのに便利です。
$ flock -n /tmp/backup.lock ./backup.sh || echo "前回がまだ動いています"# スクリプトの中で使う形
exec 9>/tmp/myjob.lock
flock -n 9 || exit 1at決まった時刻に1回だけ実行する
Ubuntu には最初から入っていません。 で入れられます。
決まった時刻に、コマンドを1回だけ実行します。
$ echo "./backup.sh" | at 23:30
$ at now + 10 minutes <<< 'notify-send "10分たちました"'
$ atq # 予約の一覧
$ atrm 3 # 予約3を取り消すscreen端末を切り離して動かし続ける
Ubuntu には最初から入っていません。 で入れられます。
tmux と同じ目的の古くからあるツールです。
$ screen -S work # 名前を付けて開始
# Ctrl+A → D で切り離す
$ screen -ls
$ screen -r work # つなぎ直すpvパイプを流れる量と進み具合を表示する
Ubuntu には最初から入っていません。 で入れられます。
パイプを流れるデータの量と進み具合を表示します。
$ pv big.iso > /dev/null
$ pv dump.sql | mysql mydb
$ tar cf - dir/ | pv -s $(du -sb dir | cut -f1) | gzip > dir.tgzinotifywaitファイルの変更を待ち受ける
Ubuntu には最初から入っていません。 で入れられます。
ファイルやフォルダの変更を待ち受けて知らせます。
$ inotifywait -m -e modify,create,delete ./src # 変化を表示し続ける
$ while inotifywait -e close_write notes.md; do make; done # 保存するたびにビルドentrファイルが変わったらコマンドを実行する
Ubuntu には最初から入っていません。 で入れられます。
ファイルが保存されるたびに、指定したコマンドを自動で実行します。
$ 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 も効かない |