読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】PID を調べてから kill するのが面倒。pgrep・pkill・killall で名前から選ぶ【LPICレベル1】

17レスカテゴリ:Linux
1: 名無しさん

毎回 ps aux | grep で PID を探してから kill してる
名前で直接できへんの?

2: 名無しさん

前提のおさらい。kill は PID を指定してシグナルを送る。既定は SIGTERM(15)で、終わらないときに SIGKILL(9)

3: 名無しさん

>>1
pgrep で名前から PID を探して、pkill で名前を指定してシグナルを送れる。どっちも同じ選び方

4: 名無しさん

>>3
sleep を何本か動かして試した
pgrep sleep → PID が1行ずつ
pgrep -l sleep → PID と名前
pgrep -a sleep → PID とコマンドライン全体(sleep 300 など)

5: 名無しさん

>>4
pgrep slee でも sleep が見つかった。パターンは名前の一部に当たる(正規表現)。完全に一致させるなら -x

6: 名無しさん

>>5
pgrep -x slee は何も見つからず終了ステータス1やった

7: 名無しさん

>>3
ほかのオプション
-u ユーザー そのユーザーのものだけ
-f 名前じゃなくコマンドライン全体で探す
-c 数だけ

8: 名無しさん

>>7
-f はどういうときに要るん?

9: 名無しさん

>>8
名前で比べるのは /proc/PID/stat に入ってる15文字まで(pgrep の man)。それに python3 backup.py で動かしたら名前は python3 になる。pgrep -f backup.py みたいに引数で探すときに -f

10: 名無しさん

>>1
pkill の使い方は?

11: 名無しさん

>>10
pgrep と同じ指定で、見つかったプロセスにシグナルを送る。既定は SIGTERM
pkill -HUP rsyslogd のように -シグナル で変えられる
pkill -u user でそのユーザーのプロセス全部

12: 名無しさん

>>11
名前の一部で当たるから、思ってないプロセスまで止めることがある。先に同じ条件で pgrep -a して確かめる

13: 名無しさん

killall は?

14: 名無しさん

>>13
名前を指定して、その名前のプロセス全部にシグナルを送る(既定は SIGTERM)。名前は完全に一致したものだけで、killall slee は slee: no process found で終了ステータス1、killall sleep は全部止めた

15: 名無しさん

>>14
-r で正規表現、-i で1つずつ確かめる、-u でユーザー、-s や -シグナル でシグナルを変える

16: 名無しさん

>>14
pkill は一部の一致、killall は完全一致、が違いやな

17: 名無しさん

>>16
pgrep で確かめて pkill、名前が決まってるなら killall。kill は PID、の3つで使い分けるわ

管理人のひとこと