毎回 ps aux | grep で PID を探してから kill してる
名前で直接できへんの?
【疑問】PID を調べてから kill するのが面倒。pgrep・pkill・killall で名前から選ぶ【LPICレベル1】
前提のおさらい。kill は PID を指定してシグナルを送る。既定は SIGTERM(15)で、終わらないときに SIGKILL(9)
>>1pgrep で名前から PID を探して、pkill で名前を指定してシグナルを送れる。どっちも同じ選び方
>>3
sleep を何本か動かして試したpgrep sleep → PID が1行ずつpgrep -l sleep → PID と名前pgrep -a sleep → PID とコマンドライン全体(sleep 300 など)
>>4pgrep slee でも sleep が見つかった。パターンは名前の一部に当たる(正規表現)。完全に一致させるなら -x
>>5pgrep -x slee は何も見つからず終了ステータス1やった
>>3
ほかのオプション-u ユーザー そのユーザーのものだけ-f 名前じゃなくコマンドライン全体で探す-c 数だけ
>>7-f はどういうときに要るん?
>>8
名前で比べるのは /proc/PID/stat に入ってる15文字まで(pgrep の man)。それに python3 backup.py で動かしたら名前は python3 になる。pgrep -f backup.py みたいに引数で探すときに -f
>>1
pkill の使い方は?
>>10
pgrep と同じ指定で、見つかったプロセスにシグナルを送る。既定は SIGTERMpkill -HUP rsyslogd のように -シグナル で変えられるpkill -u user でそのユーザーのプロセス全部
>>11
名前の一部で当たるから、思ってないプロセスまで止めることがある。先に同じ条件で pgrep -a して確かめる
killall は?
>>13
名前を指定して、その名前のプロセス全部にシグナルを送る(既定は SIGTERM)。名前は完全に一致したものだけで、killall slee は slee: no process found で終了ステータス1、killall sleep は全部止めた
>>14-r で正規表現、-i で1つずつ確かめる、-u でユーザー、-s や -シグナル でシグナルを変える
>>14
pkill は一部の一致、killall は完全一致、が違いやな
>>16
pgrep で確かめて pkill、名前が決まってるなら killall。kill は PID、の3つで使い分けるわ
管理人のひとこと
- pgrep は名前から PID を探す(
-l名前も、-aコマンドライン全体、-uユーザー、-fコマンドライン全体で探す、-x完全一致、-c数)。パターンは名前の一部に当たる正規表現。 - pkill は pgrep と同じ選び方でシグナルを送る(既定 SIGTERM、
-HUPなどで変更)。思わぬプロセスに当たらないよう、先に pgrep で確かめる。 - killall は名前が完全に一致するプロセス全部にシグナルを送る(既定 SIGTERM、
-rで正規表現、-iで確認)。 - 名前で比べるのは15文字までなので、引数で探すなら
-f。