私の PySide アプリは、Linux でのシャットダウン中に送信された TERM シグナルを無視するようです~/.config/autostart
。
以下の実験により、問題は PySide/Qt にあるという結論に達しました。
まず、TERM シグナルをキャッチし、確認メッセージを出力して終了する単純な Python スクリプトを作成しました。これがコードです。
import signal
import sys
import time
def on_quit(*args):
print 'here', args
sys.exit(0)
for i in [x for x in dir(signal) if x.startswith('SIG')]:
try:
signum = getattr(signal, i)
if i == 'SIGCHILD' or i == 'SIGCHLD':
continue
signal.signal(signum, on_quit)
except Exception, m:
print 'Skipping %s' % i
time.sleep(1000000)
for ループは、考えられるすべてのシグナルで on_quit メソッドを登録するだけです。
これをターミナルで呼び出し、kill して TERM シグナルを送信すると、スクリプトによってキャッチされて処理されていることが確認できます。
次に、にエントリを含めて、起動時にこのスクリプトを実行しようとしました~/.config/autostart
。エントリは次のようになります。
[Desktop Entry]
Version=1.0
Type=Application
Name=Test
GenericName=Test
Comment=Test
Exec=strace -T -f -tt -o run_test.strace run_test
Terminal=false
StartupNotify=false
strace を使用してスクリプトのシステム コールをトレースし、スクリプトが TERM シグナルをキャッチしていることを別の方法で確認しました。strace のオプションは、システム コールに費やされた時間を含めること、フォークを追跡すること、時刻をマイクロ秒単位で出力すること、出力を に送信することrun_test.strace
をこの順序で指示します。
run_test
Python スクリプトを呼び出す単なる bash スクリプトです。それが含まれているのは、それが私の元の PySide アプリが呼び出されている方法だからです。そのコードは次のとおりです。
#!/bin/bash
python test.py &>out.test
デスクトップエントリを に追加し~/.config/autostart
、コンピューターを再起動してからシャットダウンすることで、テストを進めました。run_test.strace
「--- SIGTERM (Terminated) @ 0 (0) ---」という行が含まれており、SIGTERM が送信され、捕捉されたことを確認します。out.test
さらにそれを確認する予想される出力も含まれています。
次に、シグナル処理を使用して単純な PySide アプリケーションをテストしようとしました。コードは次のとおりです。
import signal
import sys
import time
from PySide.QtGui import QApplication
from PySide.QtCore import QTimer
app = QApplication([])
timer = QTimer()
timer.start(500)
timer.timeout.connect(lambda: None)
def on_quit(*args):
print 'here', args
sys.exit(0)
for i in [x for x in dir(signal) if x.startswith('SIG')]:
try:
signum = getattr(signal, i)
if i == 'SIGCHILD' or i == 'SIGCHLD':
continue
signal.signal(signum, on_quit)
except Exception, m:
print 'Skipping %s' % i
app.exec_()
QTimer は、シグナル ハンドラを実行できるようにするために不可欠です。
ターミナルで上記のスクリプトを実行し、TERM シグナルを送信すると、TERM シグナルが捕捉されて処理されていることが出力で確認されます。strace で実行すると、「--- SIGTERM (Terminated) @ 0 (0) ---」という行も表示されます。
ただし、起動時に実行すると、出力は on_quit メソッドが呼び出されていないことを示しており、strace 出力には TERM シグナルが送信されたことを示していません。
誰でも助けてもらえますか?必要に応じて、strace の出力を提供できます。システムは Ubuntu 12.04 32bit です。
編集:さらなる実験では、QApplication では発生するが、QCoreApplication では発生しないことが示されています。それはおそらくGUI関連のものですか?