2016-05-29 22 views
2

助けてくれてありがとう!シェルからPythonスクリプトを起動して停止するには

私は、シェルスクリプトからPythonスクリプトを開始して停止したいと考えています。開始はうまくいきますが、10秒後にPythonスクリプトを停止/終了します。 (それは数え続けるカウンターです)。芽は止まらない....私はそれが最初の行にぶら下がっていると思う。

10秒間停止するのを始める正しい方法は何ですか?

シェルスクリプト:

python /home/pi/count1.py 

sleep 10 

kill /home/pi/count1.py 

それはまだ働いていません。私はバックグラウンドでスクリプトを実行することのポイントを得る。それは働いている!

python /home/pi/count1.py & 

sleep 10; kill /home/pi/count1.py 

/home/pi/sebastiaan.shを::19行目:殺す:/home/pi/count1.py:しかし、私は別のコメントを行った後、私のラズベリーを形成し得る引数がなければなりませんプロセスまたはジョブIDを

であることを持っている:(しかし、何の助けをありがとう!)

sleep 10; kill /home/pi/count1.py 
+0

オースティン氏によると、Pythonスクリプトを実行しているバックグラウンドプロセスのプロセスIDを取得する必要があります。これが 'LASTPID = $! 'コマンドの動作です。次に、 '$ LASTPIDを殺す 'を実行してそのプロセスを終了させることができます。もしうまくいかない場合は、 'kill -SIGKILL $ LASTPID'を試してみてください。 –

答えて

9

Pythonスクリプトが終了するまであなたが最初の行の右、シェルスクリプト「ハング」しています。そうでなければ、シェルスクリプトは続行されません。したがって、バックグラウンドで実行するには、シェルコマンドの最後に&を使用する必要があります。これにより、pythonスクリプトが起動し、シェルスクリプトが続行されます。

killコマンドはパスを取らず、プロセスIDをとります。結局のところ、あなたは同じプログラムを何回か実行して、最初のもの、あるいは最後のものを殺そうとします。

bashシェルは、最後のバックグラウンドプロセスのpidである$!変数をサポートしています。

あなたの現在のスクリプト例は、Pythonジョブとスリープジョブを並行して実行しないため、間違っています。装飾がなければ、スクリプトはpythonジョブが完了するのを待ってから10秒間スリープ状態にしてからkillします。 OSは、あなたがそれをやらせる場合は、他のすべてのプロセスを終了することができます

python myscript.py &  # <-- Note '&' to run in background 

LASTPID=$!    # Save $! in case you do other background-y stuff 

sleep 10; kill $LASTPID # Sleep then kill to set timeout. 
+0

+1私の答えの背景部分を見落としました。しかし、ちょうど奇妙なことに、y PID変数には、実行中の最後のプロセスのPIDや現在のシェルからの最後のコマンドが含まれていますか? 2番目は論理的ですが、私はそれをプレイしたことはありません。 – Dalen

+0

[TFM、](https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html) "...実行されたかどうかにかかわらず、バックグラウンドに最後に配置されたジョブのプロセスID非同期コマンドまたはbg組み込みの " –

0

:あなたはおそらく欲しい

のようなものです。私。 OS自体に属する重要なプロセスではない場合。

コマンドkillは、プロセスの名前またはコマンドではなく、プロセスを強制終了するためにPIDを使用します。

これにはpkillを使用します。

また、Pythonアプリケーション内で検出して応答するSIGTERM(プログラムの終了要求)ではなく、別のシグナルを送信して応答することもできます。

たとえば、プロセスが稼動しているかどうかを確認し、プロセスからデータを取得したい場合があります。

これを行うには、ユーザーのカスタム信号の1つを選択し、シグナルモジュールを使用してPythonプログラム内に登録します。

スクリプトがハングする理由を確認するには、Austinの答えを参照してください。

関連する問題