今回の話は、Linuxユーザのためだけですので、あしからず。
なにか間違った値を入れてしまったりして、メモリが右肩上がりに上昇し、メモリをフルに使いきり、パソコンが動かなくなるということは、時々あるでしょう。会社のマシンは128GBですが、まれになります。 そんなときは、 CUIモードで対処したり、同僚のマシンから操作してもらったり、泣く泣く電源を落としたりと、みなさんもこんな経験はたくさんあるでしょう。 残念ながら、いろいろセーブしてなくて、「ごめんなさい」を連呼しながらEscを連打しても、ダメなときはダメです。
そうなる前に、問題のプロセスを強制的に終了させましょう。 というわけで、今回はBashを調べてみました。基本Linuxで仕事してますが、Bashやコマンドは避けてきたので、何か間違ってる点や、もっといい方法がありましたら教えてください。
プロセス一覧から探しだして、kill
まずは、ベーシック。 プロセスを表示するコマンドはps。 みなさんは、どういうオプション使っているかはわかりませんが、自分はいつもこれ
ps aux
端末内外のプロセスを表示して、CPUとメモリの使用量も表示させる。
さらに、Houdiniのプロセスだけを表示させる
ps aux | grep houdini-bin
表示された結果から、見つけた対象のプロセスIDを殺す。
kill -SEGV 123456
このSEGVは、ホント助かりますよね。Windowsにはないらしいですが、可哀想に。
これで、プロセスが死に、$houdini_tmpのなかに、シーンファイルが、保存される。まっ、たまに保存が失敗することがありますが。
さて、ここまでは普通の手順。もう少し、賢くやってみましょう。
すべてのHoudiniプロセスを、kill
まずは、今あるHoudiniのプロセスすべてをKillします。
kill -SEGV `ps aux | grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f 2`
houdini-binは、houdiniの立ち上げ方によって、名前変わるので、各自変えてください。ちなみにhoudini-bin はターミナルで、houdini_sourceをセットし、houdiniとタイプし起動したら、そうなります。 なので、それらを考慮するなら、複数指定しときましょう
grep -e [h]oudini-bin -e [h]indie-bin
[]を使う理由は、プロセスにgrep自身が表示されないようにするためです。
ps aux | grep [h]oudini-bin
実行すると、こんな感じのものが返ってくると思います。
shohei 9042 4.7 1.5 5985364 2067844 ? Ssl 10:54 11:17 /opt/hfs16.0/bin/houdini-bin shohei 24231 0.4 0.4 1385564 544956 ? Ssl Jun05 11:00 /opt/hfs16.0/bin/houdini-bin
分かりづらいかもしれせんが、連続したスペースがあります。これだと不便です。
そこで、これ。
tr -s ' '
-sは、同じ連続した文字を1文字に置き換えるオプションです。
ps aux | grep [h]oudini-bin | tr -s ' '
これを付け加えて実行すると、
shohei 9042 4.7 1.5 5985364 2067844 ? Ssl 10:54 11:16 /opt/hfs16.0/bin/houdini-bin shohei 24231 0.4 0.4 1385564 544956 ? Ssl Jun05 11:00 /opt/hfs16.0/bin/houdini-bin
綺麗になりました。
さらに、左から2番めにあるのがプロセスIDですので、これだけを取り出します。
cut -d ' ' -f2
-dが区切り文字の指定で-fが抽出する番号です。pythonでいう、split(’ ‘)[2]ですね。
grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f 2
9042 24231
この返ってきた番号すべてをkillします。
1番メモリくってるHoudiniを、kill 全部のHoudiniはkillしたくないけど、一番メモリを食ってるやつのみをkillしたい
kill -SEGV `ps aux --sort -vsize | grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f 2| sed -n 1p`
まずメモリ使用量が大きい順に、ソートする。
ps aux --sort -vsize
また、プロセスIDだけ取り出す。そしたら、一番最初のIDだけにする。
sed -n 1p
あとは、まえのと一緒です。 ちなみに、1番目から3番目にメモリを食ってるのを対象にするには、この部分をこうします。
sed -n 1,3p
コマンドとして登録 しかし、メモリを急激に食い始めたやつを止めるには、悠長にこんな長いコマンドを打ってる時間は、残されてません。 コマンドに登録して、さらにスマートにしてみましょう。
まず、全部をkillするコマンドを作ってみます。以下のコードをファイルとして
/usr/local/bin
に保存します。名前はkillhoudiniallとしときます。
#!/bin/sh
kill -SEGV `ps aux | grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f 2`
ファイルのパーミッションで、プログラムとして実行可能にしときましょう。
最後に、メモリを食ってる順番から消すようにするコマンドを作ります。コマンド名はkillhoudiniとします。
#!/bin/sh
BASECOMMAND="ps aux --sort -vsize | grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f2 | sed -n"
if [ $# -ne 2 ]; then
if expr "$1" : '[0-9]*' > /dev/null
then
kill -SEGV `eval ${BASECOMMAND} $1p`
exit 1
else
echo "error: Not a number"
fi
elif [ $# -ne 3 ]; then
if expr "$1" : '[0-9]*' > /dev/null && expr "$2" : '[0-9]*' > /dev/null
then
kill -SEGV `eval ${BASECOMMAND} $1,$2p`
exit 1
else
echo "error: Not a number"
fi
else
echo "error: Not support"
exit 1
fi
要点だけ説明すると、引数が2つの時のみ実行するために
$# -ne 2
変数が整数か否かのチェック
if expr "$1" : '[0-9]*' > /dev/null
これで、”killhoudini 1”とやれば、1番メモリ食ってるのをkill。”killhoudini 2 4”とすれば、2番目から4番目にメモリを食ってるのをkillします。
余談ですけど、Autodesk系を抹殺するには rm -rf /opt/Autodesk* ですね。(´ω`)
今の時代、勉強しなくてもネット見れば、誰でも簡単なコードはすぐかける。いい時代だけど、できないなんていう戯言は一切通用しない時代。