トレイアイコンを実装しようとしているので、プロセス(jackd)を制御できます。最も顕著なのforkした子プロセスとそのjackdサブプロセスをPythonでkillする方法
- 私は
- ログ記録の目的のためにプロセスのstdoutとstderrを読みたい、私は殺害を引き起こしているメインプログラムのメニューエントリ
からプロセスを殺すことができるようにしたいです私の頭痛。私はstdoutとstderrを読むと、アイコンを反応させ続けるために余分なスレッド/プロセスでこれを行わなければならないと信じています。そこでfork()を使用して子プロセスを作成し、子にsetsid()
を呼び出しました。その子プロセスは、その後
from subprocess import PIPE, STDOUT, Popen
def runAndLog(self, cmd):
po = Popen(cmd, stdout=PIPE, stderr=STDOUT)
line = po.stdout.readline()
while line:
print(line.rstrip())
line = po.stdout.readline()
self.runAndLog(["jackd","-R", "-P80", "-t5000", "-dfirewire", "-r44100", "-p256", "-n3"])
今、私は私が私のフォークの子プロセスを取得し、同じプロセスグループにjackdができることを期待していたので、私は一度ではなく、私の驚きに、両方殺すことができるsubprocess
モジュールを使用してjackd呼び出しますPopen
は、新しいプロセスグループと新しいセッションを作成しました:
PID PPID PGID SID COMMAND
5790 5788 5788 31258 python (parent, main)
5791 5790 5791 5791 python (forked child after setsid - ok)
5804 5791 5804 5804 jackd (grandchild created by Popen)
ので、子供が孫を殺さないと私は孫のPID(5804)を作るのいずれかのきれいな方法が表示されていない殺害でmain
に知られています明示的にそれを殺すために。私はおそらく、瀕死の子供が孫を殺させるために、信号をトリッキーに使うことができるかもしれませんが、私はこれをすることをためらっています。
また、SIDが私の子供のSIDと異なるので、jackdプロセスでそれを子供のプロセスグループに強制的に使用することはできません。setpgid
- は、新しいセッションを作成しないようにpopenのを説得する必要がある、または
subprocess
未満魔法でモジュールを使用していますが、まだstdoutとstderrを読むために私をalowsいる。信じる
しかし、私はどちらかの方法を知りません。確かにプロセスグループに関する私の知識は幾分限られています。
/home/martin >python --version
Python 2.7.1
更新10月12日
私は、新しいセッションがパイソンではなくjackd
自体によって作成されていないことがわかりました。 jackdをxterm
に置き換えると、すべて正常です。
PID PPID PGID SID COMMAND
12239 4024 12239 4024 python (parent, main)
12244 12239 12244 12244 python (forked child after setsid - ok)
12249 12244 12244 12244 xterm (grandchild has same PGID and SID - ok)
は、私はまた、this
これらのジャック日数呼び出したがsetsid()自体は唯一
にオプションを残し、新たな プロセスグループリーダー
として設立取得するために
- メイクジャックのPIDをに知らせる210とjackd
その上の任意のアドバイス殺す殺す明示的にそれを殺す、または
。
この回答は役に立ちますか? http://stackoverflow.com/a/4791612 –
これは私がやっていることとほぼ同じです。しかし、私は問題が実際にはpythonではなくjackdであることを発見しました。私はそれに応じて私の質問を更新します。 –
スレッドだけを使って、 'jack'を直接制御してみませんか?実際のコマンドを制御するために、なぜ独立した子プロセスを作るのですか?それをずっと複雑にすることのメリットは何ですか? –