os.system は、サブプロセスの実行が終わるまでブロックする。& をつけるとブロックしない。
Python のスレッドは、daemon フラグが立っていないと、それが終了するまで python インタプリタが残る。daemon フラグが立っていると、他のに合わせて自動で死亡する。
os.system で & をつけて呼び出した場合、python インタプリタの子プロセスではなくなる(pstree で確認)。したがって、python インタプリタを終了してもプロセスは残る。& を付けずに daemon スレッドから起動した場合、Python インタプリタの子としてサブプロセスが起動するが、インタプリタを終了した時点で親プロセスの変更が行われ(どういう仕組み?)、やはりサブプロセスは残る。
import os import threading def worker(): os.system("gedit &") # try without & print "worker thread end" th = threading.Thread(target=worker) th.daemon = True # try False th.start() print "Thread started" raw_input() print "Main thread end"