Ctrl-Zを受信した後もプロセスは停止しません。

Ctrl-Zを受信した後もプロセスは停止しません。

信号ハンドラについて学んでいます。私は受信したすべての信号を処理して印刷するための単純なPythonスクリプトを書いています。その後、リモートシステムでスクリプトを実行しますssh。その後、Ctrl C信号を送信すると、リモートプロセスが期待どおりに中断されます。代わりに、Ctrl Z シグナルを送信すると、リモート プロセスは期待どおりに停止しません。

まず、Ctrl Zがリモートスクリプトに到達できない可能性があると思いました。ただし、カスタムハンドラを接続すると、Ctrl Zが送信されることを検出します。

その後、Ctrl Zがプロセスで無視された可能性があると思いました。ただし、SIGTSTP の現在のハンドラを印刷すると、SIG_IGN が取得されると予想されます。ただし、これはSIG_DFLです(SIGTSTPの場合はプロセスの停止を意味します)。

誰でもこの動作を説明できますか?

SSHコマンドを実行します。

ssh ubuntu16x64-1 -t 'python3 ~/sig_check.py'

署名の確認Pythonスクリプト:

#! /usr/bin/python3

import signal, errno
import time, os, sys

all_sigs = list(signal.Signals)

open('sig_log.txt', 'w').close()

def print_sig(num, frame):
    with open('sig_log.txt', 'a') as f:
        f.write('{}\n'.format(num))
    print(num)

for sig in all_sigs:
    if sig == 20: # SIGTSTP
        print(sig, signal.getsignal(sig))
        continue # commenting this would set handler for Ctrl Z
    try:
        signal.signal(sig, print_sig)
    except OSError:
        print('OSerr: Skipping %s' % (sig))
    except ValueError:
        print('Valerr: Skipping %s' % (sig))

print("Process pid %d" % (os.getpid()))
print("Parent pid %d" % (os.getppid()))

while True:
    time.sleep(2)
    pass

編集する:最後の段落に埋もれてこれページでこれが起こる可能性がある状況を見つけました。つまり、SIGTSTPを受信するプロセスが孤立プロセスグループにある場合です。しかし、今回の事件がそのようなカテゴリに属する​​かどうかはわかりません。

関連情報