2

私はraspberry-piを使用してプロジェクトに取り組んでおり、piのボタンを押してプログラムを起動し(squeezelite https://code.google.com/p/squeezelite/ )、ボタンが押されたときに検出したいと考えています。プログラムの起動時に取得された PID を使用して、プログラムを再度強制終了します。これには python subprocess モジュールが適していると思いますが、解決できない問題があります。

コード:

proc=subprocess.Popen(['squeezelite','-o','sysdefault:CARD=ALSA','-n','test','-m', '01:00:00:00:00:03','-z'])

2つのプロセスを起動するようです:

2886 pts/0   Z+    0:00 [squeezelite] defunct

2887 ?       SLsl  0:00 squeezelite -o sysdefault:CARD=ALSA -n test -m 01 00 00 00 00 03 -z

proc.pid は最初の PID を返します。

proc.communicate() を呼び出すと、最初のプロセスがクリーンアップされ、2 番目のプロセスだけが残ります。ただし、2番目のプロセスのPIDがわからないままです(proc.pidが最初のプロセスを提供するため、現在はなくなっています)。そのため、kill コマンドで PID を使用できません。

subprocess.Popen とさまざまなオプション (文字列引数、パラメーター引数、shell=True、shell=False など) のさまざまな組み合わせを試してみましたが、それぞれが同様の結果をもたらします。

これを機能させるのを手伝ってくれる人はいますか?または、プログラムを起動し、後でそれを終了するより良い方法はありますか?

ありがとう

4

1 に答える 1

1

プロセスをデーモン化する、 squeezelite の-zオプションを使用しています。これは、追加のプロセスが作成されている理由を説明しています。最善の解決策は、OS のデーモン化ツール (start-stop-daemon など) を使用して、Python で行う呼び出しを簡素化することだと思います。Debian スクイーズ でのスクイーズライトのデーモン化に関するガイドがあり、開始するのに役立ちます。

プロセスを開始し、その PID をファイルに保存して、後で停止できるようにする必要があります。1 つの方法は、開始/停止とボタンの識別子の 2 つのパラメーターを受け取るデーモン スクリプトを使用することです。

于 2013-08-07T22:49:37.277 に答える