Windows/Linux

SSH接続切断時にプログラムが停止する理由と対処法

処理に時間のかかるプログラムをSSHから実行していたのですが、別の作業をするため、SSHを切断して、処理の完了時間を待っていました。
一向に処理が完了している気配がなく、調べてみると、途中で処理が止まってしまっていたことがありました。

この理由について調べてみました。

事象が発生するケース

  • 処理に時間のかかる処理を実行するとき
  • デーモンを使わずに、HTTPサービスを実行するとき

※SSHを使って、httpdを実行した時はこの事象は発生しません。

SSH接続切断時にプログラムが停止する原因

プログラムが停止する理由は、SIGHUPシグナルが原因でした。

SSH接続をしたうえで実行するプログラムは、SSHの子プロセスとして動作します。
SSH接続終了時に、SSHの子プロセスにはSIGHUPシグナルが送出されます。
子プロセスがこのSIGHUPを受け取ると、SSH接続が終了したと判断し、プロセスが終了します。

動作確認

動作の確認をしてみました。
プログラム実行時とSIGHUPシグナル受信時にログを残すプログラムを実行してみます。

この通り、TeratermによるSSH接続終了時にSIGHUPを受信していることが分かります。

フォアグラウンドプロセス、バックグラウンドプロセスに関わらずウィンドウからSSHを切断すると、SIGHUPが送られるようです。

 

【 exit 】コマンドを実行して処理を終了した場合

私が動作を確認していたところ、SSH経由で実行するプログラムをバックグラウンドプロセスにして、
[ exit ] コマンドを実行し、SSH接続を終了した場合にはSIGHUPが受信されませんでした。

[ exit ] を実行しましたが、SIGHUPをプログラムが受信しておらず、PPID(親プロセスID)が1になっています。

 

[ exit ] を実行した場合には、Tera Termがグレースフルシャットダウンすることで、継続中のプロセスは継続されるのではないかと思われます。

[ exit ] コマンドを実行する習慣がなかった頃によく遭遇していた気がします。

対処法

SIGHUPを無視させるコマンドとして、nohupコマンドがあります。

nohupコマンドは、SIGHUPシグナルを無視させるコマンドです。SSH接続終了後もプロセスを動かすことができます。

nohupコマンドを使って、60秒間処理が持続するプログラムをフォアグラウンドプロセスで実行したところ以下のようになります。

ウィンドウからSSHを切断しても以下のように、親プロセスがつけ変わっています。

付録:処理に長時間かかるプログラムを既に実行してしまったあなたへ

SSH経由で、処理に長時間かかるプログラムを既に実行してしまっている場合の対応方法を紹介します。
nohupコマンドを使って、プログラムを実行すれば、SIGHUPを無視できますが、既に実行してしまっている方もいらっしゃると思います。

disownコマンドを使うことで、SSHセッションからバッググラウンドプロセス(ジョブ)を切り離すことができます。

下記の手順を踏むことで対応することが可能です。

  1. (フォアグラウンドプロセスとして実行している場合)
    [ Ctrl ] + Z を押してプロセスを一時停止させます。

    bgコマンドを使って、停止したプロセスをバックグラウンドで実行させます。
  1. jobsコマンドを実行して、切り離したいバックグラウンドプロセス(ジョブ)のジョブ番号を確認します。
  1. disown %[ジョブ番号]を使用して、切り離します。

まとめ

本件調査をしてみましたが、OSの仕組みであるシグナルまで調べることになるとは思いもよりませんでした。
この件を通じて、OSの仕組みを調べるきっかけになったので、小さな気づきを無視しないことは大事なのだと思いました。

LogStare Collector 無償版

記載されている会社名、システム名、製品名は一般に各社の登録商標または商標です。

当社製品以外のサードパーティ製品の設定内容につきましては、弊社サポート対象外となります。

PAN-OS 9系以降におけるURLフィルタリングプロファイルの設計変更の話前のページ

LS M365 情報漏洩対策活用方法次のページ

ピックアップ記事

  1. Zabbixヒストリデータのレポート生成について
  2. IoT機器「Raspberry pi」とLogStare Collectorで温…
  3. 自社製品をAMIにしてAWSマーケットプレイスへ出品
  4. ログフォワーダー「okurun.jar」について

関連記事

  1. Windows/Linux

    [Linux/Windows]IPアドレスとルーティング確認方法

    本記事では、初心者用として、LinuxとWindowsを用いてIPアド…

  2. SysmonForLinuxをUbuntuとAlmaLinuxに入れてログ取得

    Windows/Linux

    SysmonForLinuxをUbuntuとAlmaLinuxに入れてログ取ってみた

    今回はSysmon(プロセス作成、ネットワーク作成、ファイル操作等のW…

  3. Windows/Linux

    ARPって何だ・・?新入社員が調べてみた(Linux版)

    今回は新入社員研修の一環として、ナレッジステアを書こうという事で作成し…

  4. Windows/Linux

    Audit.logをsyslogを利用して収集する方法

    当記事では、rsyslogを利用してAudit.logをsyslogサ…

  5. Windows/Linux

    Windows Server (2019,2016, 2012 R2)にSNMP (v1, v2c)…

    当記事では、Windows Server にSNMP の設定を投入する…

  6. Windows/Linux

    Linux系OSにaws cliバージョン2をインストールする方法について

    当記事では、Linux系OSにaws cliをインストールする方法につ…

LogStare Collector 無償版
月額200円でM356の監査ログの運用レベルUP LogStare M365
AWSのログ分析・モニタリングに 次世代のマネージド・セキュリティ・プラットフォーム LogStare

  1. 実践記事

    DNSキャッシュポイズニングやってみた
  2. NW機器

    SonicWall UTMにSyslog送信設定を追加する方法について
  3. NW機器

    PaloAltoのIPsec IKEv1 Phase1におけるトラブルシューティ…
  4. NW機器

    Nutanix Prism ElementにおけるSNMP監視/REST API…
  5. ログ分析・監視テクニック

    nProbeであらゆる通信をログに記録し可視化する
PAGE TOP