GalaxyからConnect Botでサーバ接続中にapt-get ~を行っていたら・・・
Connect BotでSSH接続を行っている際に一定時間が経過するとセッションが切れてしまう現象に悩まされておりまして。
ほんとはこの問題を解決するのが一番早いのですが、使用頻度が低いため今まで放置していました。←管理者としてどうよ!
本日、会社で仕事中なのですがふと思い立った点がありまして久しぶりにConnect Botで作業していたんです。が、仕事中でそれなりに忙しくしていたらパッケージのインストール中(インストールしますか?の質問に答えるところ)で放置してしまいセッションが切れてしまいました。
ありゃりゃ・・・と思いつつ接続しなおしてインストールしようとapt-get ~と入力すると今度は「/var/lib/dpkg/lockをオープンできません」なんてコメントが表示され、インストールを実行することができません。
どう考えても先ほどのセッション中断によって作成されたロックファイルの影響であろう・・・と思いつつ原因と対策を備忘録代わりに残しておきます。
/var/lib/dpkg/lockを使用しているプロセスをチェック
コマンドにて以下のとおり入力します。
# ps ax | grep apt
psコマンドはプロセスの稼働状況を調べるもの。aオプションは「自分以外のプロセスも表示」、xオプションは「制御端末のないプロセスも表示」というものになります。
その結果をパイプでgrepコマンドへ渡し、今度は「apt」に該当する文字列を含む行を抽出しています。
今回の場合は予想通りapt-get install ~のコマンドがファイルを占有している様子。さてどうしたものか・・・
中途半端になっているプロセスに消えてもらう
このままではパッケージのアップグレードもインストールもままなりません。
ということで原因となっているプロセスを強制的に終了させましょう。
# kill -KILL プロセスID
プロセスIDは先ほどpsコマンドを動かしたときに左端に出力された数字となります。
これでプロセスを終了させた後にapt~を動かせば問題解決!
まとめ
はい。今回の流れをまとめますと
- apt-get install ~の動作中に何らかの原因(今回はセッションの中断)で止まってしまった場合/var/lib/dpkg/lockファイルを開けなくなり、結果的に更新ができなくなる
- ロックファイルを占有しているプロセスを「ps ax ~」コマンドで調査、プロセスIDを調べて・・・
- 該当するプロセスを「kill -KILL ~」コマンドで止めると再びパッケージ関連の処理ができるようになる
といった具合になります。
ただ、本来一番重要なのは「稼働中のプロセスをむりやり殺す」などというシステム上よろしくない手法で解決することではなく予期せぬセッションの中断をなくすことだと思います。
ネットワーク障害など不測の事態であれば止むを得ないと思いますが、今回のGalaxy経由(というかSPモードの問題かも?)での接続は一定時間でセッションが切れることが分かっている以上、切断が発生しないようにすることが大切です。
サーバ側とクライアント側双方で設定を施すことで接続断を防ぐこともできるようなので調べてみて、対処できたら改めて投稿したいと思います。