macOS版Goodnotesを使っていると,テキスト入力ツールが反応しなくなる(文字入力を受け付けなくなる)ときがあります。この場合,Goodnotesアプリを再起動する必要があります。
軽度の症状の場合,単に Command
+Q
で終了させれば解決するのですが,多くの場合,単に Command
+Q
で終了させて再起動するだけでは,同じ症状が再発してしまいます。このような場合,ps -ax
コマンドで調べてみると,終了させたはずの Goodnotes のプロセスが残存しており,暴走状態になっていることが多いです。このような場合,Command
+Option
+esc
からの画面でも強制終了できず,コマンドラインから暴走している Goodnotes プロセスを強制終了させる必要があります。
killall
や pkill
による Goodnotes のプロセス終了
ターミナルから,Goodnotesのプロセスを,名前を指定して終了させるには,killall
や pkill
コマンドが使えます。
$ killall -KILL Goodnotes
$ pkill -KILL -i -f Goodnotes
killall
と pkill
はどちらもプロセスを終了させるコマンドです。-KILL
で強制終了シグナル (-9
や-SIGKILL
でも同じ)を送っています。killall
はプロセス名自体が完全一致したプロセスのみを終了します。pkill
の場合は部分一致検索となります。-i
を付けておくことで大文字・小文字を同一視しています。さらに,-f
を付けることで,プロセス名本体のみならず,パス名などコマンドライン全体を見て,わずかにでも一致する部分があれば終了させます。
grep
& kill
による古典的方法
便利な killall
や pkill
に頼らない,古典的方法も紹介しておきます。
古典的手法(手動)
まず,ps -ax
の結果を grep
することで,暴走しているGoodnotesのプロセスID (PID)を特定します。
$ ps -ax | grep -i Goodnotes
1675 ?? 0:57.00 /Applications/Goodnotes.app/Contents/MacOS/Goodnotes
1677 ?? 0:57.10 /Applications/Goodnotes.app/Contents/MacOS/Goodnotes
28487 ttys000 0:00.01 grep -i Goodnotes
このうち,grep
自身のプロセスは除いて,他のGoodnotes関連のプロセス(複数あれば全部)を強制終了させます。
$ kill -KILL 1675 1677
PIDの特定と kill
を自動化させる
GoodnotesプロセスのPIDを毎回目で探すのが面倒なので,これを自動化しましょう。
まず,grep
自身のプロセスを除くには,次のトリックを使います。
$ grep -i [^]]Goodnotes
[^]]
の部分がトリッキーですね。ここは正規表現で,「]
以外の任意の1文字」を意味します。grep -i [^]]Goodnotes
というプロセスは,Goodnotes
という文字の直前に ]
が存在するので,この正規表現にマッチせず,grep
の結果から除外されるわけです。
grep
された結果からPID部分を取り出すには awk
を使います。それを kill -KILL
の引数として並べるには,xargs
コマンドが使えます。
パイプでこれらをつなげると,以下のようになります。
$ ps -ax | grep -i "[^]]Goodnotes" | awk '{print $1}' | xargs kill -KILL
シェル関数化してコマンド化する
Goodnotes以外にも使えるように,これをシェル関数にまとめておきましょう。自作のpkill
コマンドが存在しない環境下であっても,pkill
コマンドもどきとして使えます。
function taskkill () {
if [ $# -ne 1 ]; then
echo "Usage: taskkill <PROCESS_NAME>" 1>&2
return 1
fi
ps -ax | grep -i "[^]]$1" | awk '{print $1}' | xargs kill -KILL
}
.bashrc
/ .zshrc
などでこのように定義しておくことにより,
$ taskkill Goodnotes
のような指定ができるようになります。