Linuxを強制終了しないといけないことがある。
暴走したり、動かなくなったり、プロセスがおかしくなったりパターンは様々だ。
このページではLinuxの強制終了の方法をまとめてみた。強制終了をしなければならなくなったとき、参考にしてほしい。
目次
プロセスを強制終了する
プロセスが止められなくなることがある。WindowsでもMacでも同様のことはよく起こるはずだ。
こういったプロセスをユーザは意図的に止めることができる。これを「プロセスを強制終了する」という。また物騒だが「プロセスを殺す」ともいう。
killコマンド
「ps aux」や「top」コマンドなどでプロセスを確認するとそのプロセスがどの程度リソースを消費しているか? ゾンビプロセスになっていないか確認できる。「top」のほうがリアルタイムに監視可能なのでこちらを使うとわかりやすいだろう。
暴走しているプロセスがあったらプロセスIDを確認し覚えておこう。そして以下のようなコマンドを叩く
$ kill <プロセスID>
killコマンドにより、プロセスを強制終了することができる。このとき、自由にKillできるプロセスはユーザ権限によって限られる。rootユーザの場合ほぼなんでもプロセスを終了させることができる。サーバプロセスが暴走した場合などは、スーパユーザ権限でプロセスをkillすることになる。
またkillコマンドは「kill -s <シグナルナンバー> <プロセスID>」でシグナルの種類を指定できる。基本的にはkillコマンドを通達するとkill -s 15 <プロセスID>と同じ挙動をするが、これは礼儀正しくプロセスを終了させようとする。
プロセスをより「強制終了」するときはkill -s 9 <プロセスID>とする。
$ kill -l
でシグナル一覧が表示される。
$ man 7 signal
でシグナルの種類詳細が表示される。今回使用したのは
- SIGKILL 9 強制終了
- SIGTERM 15 終了
この二つだ。
killall
上記のkillコマンドでプロセスが終了しない場合、もしくはプロセスIDではなくプロセス名でkillしたい場合「killall」コマンドを使うとそれを実現できる。
killとおなじく -sオプションでシグナルを指定できる。シグナルの種類も同一だ。
oom-killer
Linuxにはメモリの内容が限界に達しようとすると、自動でメモリリソースを大きく消費しているプロセスをkillする仕組みがそなわっている、それが「oom-killer」だ。しかし重要なシステムプロセスをkillすることがある。ことにより、サーバプロセスやXなどのプロセスがkillされることがある。メモリ容量は常に余裕をもって運用しよう。
Oom-killerの優先度合いは/proc/<PID>/oom_adjの値を設定することでさだめることができる。-16から+15のあいだで指定できる、数字が高いほど優先順位が高くなる。
-17にすることでOom-killerの監視対象から外すことができる。
Control + c
コンソールにおいてとっさにフォアグランドで実行しているプログラムを終了させるときは「Control + c」をおせばよい、あせっている場合は連打してしまっても問題ない。例えば「結果表示量が膨大すぎるので表示を中断したい」「プログラムを無限ループさせてしまった」ときなどに有効だ。
とりあえずフォアグランドでなにかしら暴走したときは「Control + c」を連打すれば、たいがい解決することが多い。
ちなみにCtrl+Cは、killコマンドのシグナルID2と同じだ。
コンピュータを強制終了する
プロセスではなくコンピュータを強制終了したいこともあるだろう。
shutdown -h now または shutdown -r now もしくは reboot
これは強制終了ではなく正規な手順での終了と再起動だ。
Control + Alt + del
Windowsではお馴染だがLinuxでも通用する。主にコンソール画面で有用だ。
状況によるが、起動プロセスでなにかしらのトラブルが発生したとき、とっさに「Control + Alt + del」すると、とりあえずrebootシーケンスに移行してくれる場合がある。
しかしシステムによっては「誰しもがControl + Alt + delでシステムを再起動できてしまう状態」では不都合が生じる。
セキュリティの関係上このキーの組み合わせによる再起動を無効にしている場合がある。というより、その方がいい。
SysRqを使ったマジックキーの利用
本来カーネル開発におけるデバッグなどに使われるが、この方法でも若干無理矢理にシステムをねじ伏せるようにして再起動できる。これより後の手段は「物理的に電源を落とす」ことになるので、「比較的安全に終了するための最後の手段」だ。
これを実行するにはまず、トラブルを起こす前に下準備をしておく必要がある。
# vi /etc/sysctl.conf
Kernel.sysrq = 1
を設定もしくは
# echo 1 > /proc/sys/kernel/sysrq
としてフラグをたてておく必要がある。そして
# sysctl -p
とする。この状態で
- Alt+PrintScreen+R (X Window Systemからキーボードの権限を奪取する)
- Alt+PrintScreen+S(ファイルシステムをSyncしてすべての書き込みを完了させる)
- Alt+PrintScreen+E(プロセスにSIGTERMシグナルを伝達終了させる)
- Alt+PrintScreen+I(終わらなかったプロセスを強制終了させる)
- Alt+PrintScreen+U(ファイルシステムを読み込み専用モードへ変更するため、リマウントする)
- Alt+PrintScreen+B(再起動する)
- (一般的なキーボードではAlt+PrintScreenがSysRqとなっている)
と順に押下すると再起動できる。
電源ボタンを押す
「ACPI」などのパワーマネージメント規格に対応したシステムならば「短く電源ボタンを押す」とシャットダウンが始まる様になっている場合が多い。その場合、正規終了手順をたどりシステムはシャットダウンされるので比較的安全な手段だ。
しかし「5秒間電源ボタンを押す」これは「一般的な範囲で危険を孕んだ最終手段」だ。
システムがなにかしらによってハングアップしてしまい、キーボード及びマウスから全く入力をうけつけない場合でかつ、リモートログインもうけつけない場合などの場合はこれしか停止手段がない。例えば「カーネルパニック」状態になっている時などだ。
一応HDDなどは5秒間の間にヘッダを退避させるなどの挙動をするので、メーカからみた最終手段としては想定の範囲内だろう。
またキーボードやマウスの反応をうけつけないもしくは画面がブラックアウトしている場合Xがハングアップしているという状況が考えられる。sshなどでリモートログインして、プロセスをKillするか、シャットダウンをおこなえばことなきをえることがある。
リセットボタンを押す
昨今のPCではリセットボタンが省かれてしまっている場合が多いが、一応自作PCにおいては健在している。しかしこれを押すのはあくまで、昨今自作初期段階での動作確認などで使われる場面がある以外、ほぼ使わないだろう。昔はOSがどうしても不安定な挙動をして、多々ハングアップしていた、そういった場面で渋々リセットボタンを押していたのである。昨今のOSおよびハードウェアは成熟し安定動作するので、必要性がなくなってきたのだ。
問答無用で物理的に電源がリセットされるので使うべきではない。
電力供給を断つ
これは「最悪の最終手段」だ。「電源プラグを引き抜く」もしくは「ブレーカー」を落とす。
電力供給がなくなれば、システムは必ず停止する。しかし、当然ソフトウェア的にもハードウェア的にも最悪の手段である、破損、及び故障の原因となるので、「やってはいけない」。
これは、意図的というよりも「事故的に発生する」ことが多いくらいだろう。
個人で利用している場合不意にブレーカーが落ちることもある。しかし企業の場合何かしらの対策措置が取られていることが多い。
発電機やUPSなどだ、しかし敢えて想定するなら、最悪のシナリオとして、サーバルームに悪意ある人物の侵入をゆるしてしまった場合、即時システムを停止、一切の機密情報にアクセスをさせないための最悪の最終手段だろう。
当然システムが次回起動時に正常に起動できる保証は全くない。HDDやSSDは予期しないシステムダウンに脆弱である。そしてあなたが守るべき情報はその脆弱なHDDやSSDに保存されているのだ。それを念頭に置いておこう。
まとめ
このページではLinuxの強制終了方法についてまとめてみた。もちろん強制終了しないで済むにこしたことはないが、必ずこういう事態に直面するときは来るだろう。
できる限り安全な手段で終了させることを心がけよう。
linuxのインストール途中でコマンドがきかなくなって、再起動も終了もできず途方に暮れていたところ、上記の「SysRqを使ったマジックキーの利用」で救出してもらいました。感謝します。
お役に立てて非常に嬉しく思います。引き続きご愛顧ください。