LoginSignup
37
25

More than 3 years have passed since last update.

プロセスをあいまい検索してkillするツールをGoで作った

Posted at

はじめに

仕事しているとプロセスをkillすることがたまにあると思います。

大体はpsawkgrepで必要なプロセス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する面倒さから開放されます。
是非試してみてください

37
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
25