web-dev-qa-db-ja.com

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

私はPythonコードで環境音を聞いて検出します。これは私のプロジェクトではありません。Web(SoPaRe)で見つけました。_./sopare.py -l_コマンドを使用すると、音の録音を開始しますが、無限ループです。停止したいときは、 Ctrl+C

私の目的はこのプログラムを10秒後に自動的に停止することですが、作者と話をしたところ、プログラムには時間制限がないと彼は言いました。

_kill PID_を使用して強制終了しようとしましたが、プログラムが実行されるたびにPIDが変化します。 bashを介して一定の間隔で停止するにはどうすればよいですか?

または、このコマンドをpython with os.system()コマンドから実行することもできます。

3
Selim Turkoglu

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

timeout 10 ./sopare.py -l

その他のオプションについては、このユーティリティのマニュアルを参照してください(man timeout)。非GNUシステムでは、GNU coreutilsがインストールされている場合、このユーティリティはgtimeoutとしてインストールされます。

GNU coreutilsが使用できない場合の別の代替方法は、バックグラウンドでプロセスを開始し、10秒待ってから終了シグナルを送信することです。

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

$!は、最後に開始したバックグラウンドプロセスのプロセスIDです。この場合は、Pythonスクリプトです。

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

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

このbashスクリプトを試してください:

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

sleep 10がバックグラウンドで実行されている間、soapre.pyコマンドはbashスクリプトのみを一時停止すると仮定しています。また、ps u列のCOMMANDの値が"./soapre/py"と異なる場合もあります。独自の簡単な修正を行いますが、これは機能すると想定されています。

0
Z E Nir