2017-01-11 3 views
0

セッションの終了に反応するPythonデーモンを書き込もうとしています(つまり、bashが終了したためにTTYが閉じられています)。私が理解していることから、SIGHUPはある時点でプロセスに送られなければなりません(私は詳細をあいまいにしています)。しかし、これまで何も捕らえていません。その後、私のSSHセッションを閉じて、私は、サーバーにSSH、そこにスクリプトを起動します。セッションがPythonで終了したときに信号を取得する

#!/usr/bin/env python 
import os 
import sys 
import signal 
import time 

def log_to_disk(signum, frame): 
     with open("/tmp/SIGNAL", "w") as f: 
       f.write("Received %d!\n" % signum) 

def fork(): 
     try: 
       pid = os.fork() 
       if pid > 0: 
         # Exit parent 
         print "Parent exiting. Bye!" 
         sys.exit(0) 
     except OSError as e: 
       print "Error while forking! (%s)" % str(e) 
       sys.exit(1) 

fork() 
os.chdir('/') 
os.setsid() 
os.umask(0) 
fork() # Second fork. 

# Catch ALL the signals just in case. 
for i in [x for x in dir(signal) if x.startswith("SIG")]: 
    try: 
    signum = getattr(signal, i) 
    signal.signal(signum, log_to_disk) 
    except Exception as e: 
    print "Couldn't handle %s (%s)." % (i, str(e)) 
while True: 
     time.sleep(10) 

私は何をやってる:

は、ここに私の非機能Pythonの試みです。それで、/tmp/SIGNALファイルが作成されていることを期待してログインしますが、これまでのところ運がありません。 killでプロセスに信号を送信するとファイルが表示されるので、これはハンドラの問題ではないと仮定しています。 私はまた、一度だけフォークを試みました、そして/またはchdir/setsid/umaskの部分をコメントアウトしましたが、私はどちらも受け取っていません。 私が検討したもう1つの方法は、一度フォークして、定期的にTTYに書き込もうとしていて、閉じた時点でSIGTTOUを受け取ることを期待しています。

誰でも手伝ってもらえますか?

答えて

0

私はstdoutはもうTTY名に解決できないときを検出することで、回避策を見つけることができました:

import os 
import sys 
import time 

def fork(): 
     try: 
       pid = os.fork() 
       if pid > 0: 
         # Exit parent 
         print "Parent exiting. Bye!" 
         sys.exit(0) 
     except OSError as e: 
       print "Error while forking! (%s)" % e.message 
       sys.exit(1) 

fork() 
os.chdir('/') 
os.setsid() 
os.umask(0) 
fork() # Second fork. 

while True: 
     time.sleep(1) 
     with open("/tmp/SIGNAL", "a+") as f: 
       try: 
         os.ttyname(1) # 1 = stdout 
       except: 
         f.write("The session has been shut down :)\n") 
         sys.exit(0) 

私はまだ起こっている正確に何か分からない:I psのPythonプロセスを見ると、TTYカラムに疑問符(?)が表示されるので、二重フォーク後にstdoutを解決できる方法はわかりません。 誰かがTTYのないシェルで動作する答えを思いついた場合、この質問を少しでも開いたままにしておきます!

関連する問題