シェルで無限ループが停止せず抜け出す方法
シェルによるデッドロックによる終了不能を解決するには、以下にいくつかの方法があります。
- Ctrl+Cキーで中断可能:端末でCtrl+Cキーを押すと、実行中のコマンドを中断できます。スクリプトによって無限ループが発生している場合は、端末でCtrl+Cキーを押してスクリプトの実行を停止できます。
- killコマンドを使用:killコマンドを使えば、指定のプロセスを強制終了できます。まず、psコマンドで停止させたいプロセス(停止状態であるプロセス)のPID(プロセスID)を調べ、killコマンドにそのPIDを指定してプロセスを強制終了します。たとえば、PIDが1234の場合、次のコマンドでプロセスを強制終了できます: kill 1234
- ループ条件を変更する:自分で作成したスクリプトによって無限ループが起こった場合、ループ条件を変更してループ条件を満たさなくすることでループから抜けることができます。例えば、ループ本体に終了の判定条件を追加し、条件を満たしたときにbreakステートメントを使用してループから抜け出すことができます。
- タイムアウトコマンドは一定時間コマンドを実行した後に、コマンドの実行を打ち切ることができるコマンドです。例えば、無限ループするスクリプトを実行するコマンドをタイムアウトコマンドで、適当なタイムアウト値を設定することで実行を打ち切ることができます。例えば、以下は 10 秒後に ./script.sh の実行を打ち切ります。“`
timeout 10s ./script.sh
“` - システム監視ツールを利用する:手動で停止できない場合は、システム監視ツールを利用してデッドロックプロセスを検出して強制終了させる方法があります。例えば、topコマンドでシステム内の起動中のプロセスを確認し、デッドロックプロセスのプロセスID(PID)を調べ、killコマンドでそのプロセスを終了させます。
プロセスを強制終了する操作は、目的のプロセスが選ばれているか確認の上、慎重に行ってください。システムに不要な影響を与えないためです。