Windows/Linux

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

この記事は投稿日から1年以上経過しています。

処理に時間のかかるプログラムを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. ログフォワーダー「okurun.jar」について
  4. 自社製品をAMIにしてAWSマーケットプレイスへ出品

関連記事

  1. Windows/Linux

    Windows Server 2016 (2019,2012) /Windows 10,11 にて、…

    当記事では、WMI における各種監査ログを出力するまでの設定方法を記載…

  2. Windows/Linux

    .bash_historyの出力内容をLSCにて収集する方法

    当記事では、.bash_historyの出力内容をLogStare C…

  3. Windows/Linux

    Windowsイベントログの監視について

    当記事では、LogStare Collector(以下、LSCと記載)…

  4. Windows/Linux

    Windows ServerのDHCPログをLSCにて収集する方法

    当記事では、Windows ServerのDHCPログをLogStar…

  5. Windows/Linux

    Windowsファイアーウォールの設定方法|アウトバウンドを設定する

    Windowsファイアーウォールは、外部ネットワークからの通信を監視し…

  6. Windows/Linux

    snmpd.confに関する個人的まとめ

    当記事は、新人研修の一環でLinuxのnet-snmpの設定ファイルs…

若手エンジニア志望者を募集!
LogStare Collector 無償版
クラウド活用の「困った」「焦った」事例
月額200円でM356の監査ログの運用レベルUP LogStare M365
AWSのログ分析・モニタリングに 次世代のマネージド・セキュリティ・プラットフォーム LogStare

  1. 実践記事

    DNSキャッシュポイズニングやってみた
  2. デフォルト画像イメージ

    FortiGate

    FortiGateのSD-WAN設定について
  3. ログ分析・監視テクニック

    nProbeであらゆる通信をログに記録し可視化する
  4. SNMPを触ってみた

    ログ分析・監視テクニック

    SNMPとは?新入社員が生まれてはじめて触ってみた!
  5. NW機器

    Nutanix Prism ElementにおけるSNMP監視/REST API…
PAGE TOP