シグナルを使ったときにハマったこと

こんなスクリプトを

import signal, os
import time

def handler(signum, frame):
    print signum

print "i am heavy..."
# なにか重い処理
time.sleep(2)
print "oops."
signal.signal(signal.SIGUSR1, handler)
signal.pause()

こんなシェルスクリプトで叩こうがうまいこと動かなかった(↑のoops.が出力される前に死ぬ)。

#!/bin/bash -euxv

python /Users/develop43/workspace/hiraro/test.py &
kill -s SIGUSR1 $!

こうしたら動いた。

つまり、シグナルハンドラ登録後にシグナル送れよ、と。

#!/bin/bash -euxv

python /Users/develop43/workspace/hiraro/test.py &
# ちょっと待つ
sleep 3
kill -s SIGUSR1 $!