信号ハンドラについて学んでいます。私は受信したすべての信号を処理して印刷するための単純な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を受信するプロセスが孤立プロセスグループにある場合です。しかし、今回の事件がそのようなカテゴリに属するかどうかはわかりません。