一定時間後にコマンドラインでプロセスを停止/終了

一定時間後にコマンドラインでプロセスを停止/終了

周囲の音を聞いて検出するPythonコードがあります。これは私のプロジェクトではなく、オンライン(SoPaRe)で見つけました。その./sopare.py -lコマンドを使用すると、サウンドの録音が開始されますが、無限に繰り返されます。停止したいときはを押してくださいCtrl+C

私の意図はこのプログラムを10秒後に自動的に終了させようとするのですが、作成者と話をしてみると、このプログラムには時間制限がないと言いました。

殺そうとしましたが、kill PIDプログラムPIDが実行されるたびに変更されます。一定間隔後にどのように停止しますかbash

または、Pythonでコマンドを使用してそれを実行できますos.system()

答え1

最も簡単な解決策は、timeoutGNU coreutilsコレクションを使用することです(ほとんどのLinuxシステムにデフォルトでインストールされています)。

timeout 10 ./sopare.py -l

man timeout詳しくは、ユーティリティマニュアル()を参照してください。 GNU以外のシステムでは、gtimeoutこのユーティリティをGNU coreutilsのようにインストールできます。

GNU coreutilsが利用できない場合、他のオプションはバックグラウンドでプロセスを開始して終了信号を送信する前に10秒間待つことです。

./sopare.py -l &
sleep 10
kill "$!"

$!最後に開始されたバックグラウンドプロセス(この場合はPythonスクリプト)のプロセスID。

待ち時間が他の目的に使用される場合:

./sopare.py -l & pid=$!
# whatever code here, as long as it doesn't change the pid variable
kill "$pid"

答え2

次のbashスクリプトを試してください。

#! /bin/bash
./soapre.py -l
PID=`ps u | awk ' $11 == "./soapre.py" { print $2 }'`
sleep 10
kill $PID

このコマンドは、スクリプトがバックグラウンドで実行されているsleep 10間にのみbashスクリプトを一時停止すると仮定します。soapre.pyまた、COMMAND列のps u値が"./soapre/py"。自分でできる簡単な修正ですが、うまくいくはずです。

関連情報