ここから本文です

Linux基本コマンドTips:【 pkill 】コマンド――名前を指定してプロセスを終了させる

8/4(金) 7:55配信

@IT

 本稿は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介してきます。今回は、プロセス名を指定してプロセスを終了させる「pkill」コマンドです。

――――
●目次
pkillコマンドの概要 | 書式 | オプション一覧

●実行例
・プロセス名を指定してプロセスを終了させる
・うっかり使うと危ないpkillコマンド
・他のシグナルを送るには
――――

●pkillコマンドとは?

 「pkill」はプロセス名を指定して、終了シグナル(TERMシグナル)などの「シグナル」を送信するコマンドです。

 同じ用途のコマンドに「killall」がありますが、対象を指定する方法や使用できるオプションが異なります。

 killallコマンドと違い、pkillコマンドの場合は対象とするプロセス名を正規表現で指定します※1。そのためpkillコマンドを使用する際には指定した内容が意図通りになっているかどうか、注意する必要があります。例えば「killall abc」は「abcという名前のプロセス」を対象としますが、「pkill abc」の場合「名前にabcを含む全てのプロセス」が対象となります。

※1 killallの場合、正規表現で指定するには「-r」オプションが必要です。

□□
●pkillコマンドの書式
pkill [オプション] [プロセス名などのパターン]
※[ ]は省略可能な引数を示しています。オプションかパターンのどちらかの指定が必要です。
□□


●pkillの主なオプション(目的別)

○pkillの主なオプション(実行内容)

・短いオプション 長いオプション 意味
-シグナル/-signal シグナル 送信するシグナルを番号またはシグナル名で指定する(本文参照)
-e/-echo 対象となったプロセスとプロセスIDを表示する
-c/-count 該当するプロセス(シグナルを送ったプロセス)の個数を表示する

○pkillの主なオプション(対象の指定方法)

・短いオプション 長いオプション 意味
-f/-full コマンドライン全体をパターンマッチの対象とする
-x/-exact プロセス名と完全に一致(マッチ)したものを対象とする ※2
-P プロセスID/-parent プロセスID 指定したプロセスIDが親であるプロセスを対象とする。プロセスIDは「,」区切りで複数指定可能
-s セッションID/-session セッションID 指定したセッションIDであるプロセスを対象とする。セッションIDは「,」区切りで複数指定可能、「0」はpkill自身のプロセスグループと見なされる
-g グループID/-pgroup グループID 指定したプロセスグループのいずれかに属するプロセスを対象とする。グループIDは「,」区切りで複数指定可能で、「0」はpkill自身のプロセスグループと見なされる
-G グループ/-group グループ 指定した実グループ(real group ID)によるプロセスを対象とする。グループは名前またはIDで指定し、「,」区切りで複数指定可能
-u ユーザー/-euid ユーザー 指定した実効ユーザー(effective user)によるプロセスを対象とする。ユーザーは名前またはIDで指定し、「,」区切りで複数指定可能
-U ユーザー/-uid ユーザー 指定した実ユーザー(real user)によるプロセスを対象とする。ユーザーは名前またはIDで指定し、「,」区切りで複数指定可能
-t 端末/-terminal 端末 指定した端末で実行されているプロセスを対象とする。端末は「tty1」など、/dev/抜きで指定し、「,」区切りで複数指定可能
-t 端末/--ns プロセスID 指定したプロセスIDの名前空間(namespace)を対象とする
-t 端末/--nslist 指定 指定した名前空間を対象とする。ipc、mnt、net、pid、user、utsを指定可能
-F ファイル名/-pidfile ファイル名 プロセスIDをファイルから読み出す
-L/-logpidfile 「-F」で指定したファイルがロックされていなかったら終了する(failで終了する)
-n/-newest 対象のプロセスから最も新しく起動されたものだけを対象とする
-o/-oldest 対象のプロセスから最も昔に起動されたものだけを対象とする

※2 「pkill to」とした場合、topコマンドのプロセスも対象になるが、「pkill -x to」と指定すると対象とならない。

目次に戻る

●プロセス名を指定してプロセスを終了させる

 「pkill 名前」で指定した名前のプロセスを終了させます。例えば「pkill top」で、topコマンドが終了します(画面1)。

□□
●コマンド実行例
pkill top
□□


●うっかり使うと危ないpkillコマンド

 pkillで指定する“名前”は、拡張正規表現として解釈されます。従って、「pkill top」の場合、実際の動作は“名前にtopを含むプロセスの終了”となります。

 pkillは、名前を使ってプロセスIDを表示する「pgrep」コマンドとほとんど同じオプションが使用できるので※3、どのプロセスが対象になるのか、あらかじめpgrepで確認してから実行すると安心です。

※3 pkillの場合、表示内容を指定する「-d」「-l」「-a」の他、検索条件の否定を意味する「-v」(--inverse)オプションが使用できません。なお、pkillとpgrepはpsコマンドと同じ「procps-ng」パッケージ(システム情報関連のパッケージ)に収録されています。

 pgrepはプロセスIDを表示するコマンドです。「-l」オプションを指定するとプロセス名も一緒に表示します。pkillでは「-e」オプションを使うと、実行の対象となったプロセスを事後表示できます。

 以下の実行例では、「pkill vi」だとどのような動作になるかを「pgrep -l vi」であらかじめ確認しています。ここではプロセスIDが1139の「libvirtd」※4と、プロセスIDが4384の「vim」が見つかりました。なお、CentOS環境では「vi」(ターミナルで使用できるテキストエディタ)というコマンド名で「/usr/bin/vim」が起動するようエイリアスが設定されています。

※4 libvirtdは仮想マシン用のシステムサービスで、一般ユーザーが「pkill vi」や「pkill libvirtd」を実行しても「許可されていない操作(Operation not permitted)」となり失敗する。

 今回終了させたいのは「vim」の方なので、「pkill vim」とするか、pgrepの結果分かったプロセスIDを使って、「kill 4384」とすればよいことが分かります。killコマンドはプロセスIDを使ってプロセスを終了させるコマンドです。


●他のシグナルを送るには

 pkillコマンドは、killコマンドやkillallコマンド同様、プロセスに「シグナル」を送るコマンドです。デフォルトではプロセスの終了命令「TERM」シグナルを送ります。

 通常コマンドの多くはTERMシグナルを受け取ると終了しますが、TERMでは終了できない状態となっている場合もあります。そのときは強制終了命令である「KILL」シグナルを使用します。

 「pkill -KILL 名前」または「pkill -9 名前」のように、シグナルの名前か数字を使って指定します※5。

○主なシグナル

・数値/表記/意味
1/HUP/制御している端末/プロセスがハングアップした
2/INT/キーボードからの割り込み命令([Ctrl]+[C]キー)
3/QUIT/キーボードからの中止命令([Ctrl]+[\]キー)
9/KILL/プロセスの強制終了命令
15/TERM/プロセスの終了命令(デフォルト)
18/CONT/プロセスの再開命令
19/STOP/プロセスの停止命令([Ctrl]+[Z]キー)

※5 「SIGHUP」「SIGINT」のように“SIG”を付ける表記もあり、どちらも使用可能です。使用できるシグナルはkillコマンドを使い「kill -l」で確認できます。


●筆者紹介

○西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。

最終更新:8/4(金) 7:55
@IT