プロセスをあいまい検索してkillするツールをGoで作った
初めに
仕事しているとプロセスをkillすることがたまにあると思います。
だいたいはps、awk、grepで必要なプロセスIDを抽出してkillコマンドに渡していますが、
ぼくはそれがとても面倒に感じているので、あいまい検索してプロセスをkillしたいなと思ってfk(fuzzy-finder-killer)ってコマンドを作りました。

導入と使い方
go get github.com/skanehira/fkもしくはreleasesからバイナリをダウンロードしてください。
使い方は fk を実行するだけです。
fk を実行するとあいまい検索できる状態になるので、任意の単語を入力して、CTRL-iで選択します。
Enterで選択済みのプロセスをkillします。
キーバインドは次になります。
| key | description |
|---|---|
| CTRL-i | select/unselect |
| CTRL-j | go to next |
| CTRL-k | go to prev |
| CTRL-c | abort |
| Enter | kill |
しくみ
あいまい検索のUIはgo-fuzzyfinderというライブラリを使っています。
こちらのライブラリはfzfと似たインタフェースを持っていてかつとてもシンプルですので、GoでfzfのようなUIを使いたい場合はぜひ使ってみてください。
プロセス一覧はgo-psというライブラリを使っています。このライブラリでプロセスIDとコマンド名を取得できるので、それをgo-fuzzyfinderに渡します。
メインの処理は次の部分になります。
func processes() ([]process, error) {
var processes []process
procs, err := ps.Processes()
if err != nil {
return nil, err
}
for _, p := range procs {
// skip pid 0
if p.Pid() == 0 {
continue
}
processes = append(processes, process{
Pid: p.Pid(),
Cmd: p.Executable(),
})
}
return processes, nil
}
func main() {
...
procs, err := processes()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
idx, err := fuzzyfinder.FindMulti(
procs,
func(i int) string {
return fmt.Sprintf("%d: %s", procs[i].Pid, procs[i].Cmd)
},
)
...
for _, i := range idx {
pid, cmd := procs[i].Pid, procs[i].Cmd
fmt.Println(pid, cmd)
if err := kill(pid); err != nil {
fmt.Fprintln(os.Stderr, err)
}
}
}
おわり
小さなツールですが、プロセスをkillする面倒さから開放されます。 ぜひ試してみてください