私はMacBookを持っています(デフォルトのシェルはzshです)
実行可能なPythonスクリプトがあります(script1.py)。
私は次のような他の実行可能なスクリプトを使用します。起動機)走るscript1.py マイコンピュータが起動したときに実行されるターミナルウィンドウ起動機自動的に開閉し、script1.pyプロセスはまだ別のプロセスとして実行されます。 (起動機私のコンピュータの電源を入れると、szhシェルインスタンスを介して自動的に実行されます。オリジナル起動機スクリプトファイルは次のとおりです。
#!/bin/bash
cd /script1; nohup ./script1.py &
このスクリプトはうまく実行され、すべてがうまくいきます。
しかし、スクリプトで(;)の代わりに(&&)を使用すると、何が起こるのかを理解しようとしています。つまり
#!/bin/bash
cd /scritp1 && nohup ./script1.py &
私の問題はこれもうまくいきますが、Pythonスクリプトのプロセスを終了しようとするたびにszhまたは他のもの(おそらくbashプロセス)の端末インスタンスがプロセスとして実行されていることです。つまり、私が電話するとメモターミナルで私は得る
ps -ef | grep "script1"
123 14679 1 0 2:12PM ?? 0:00.00 /bin/bash /script1 starter
123 14680 14679 0 2:12PM ?? 0:03.46 /PythonFolder/python ./script1.py
123 14690 14683 0 2:12PM ttys000 0:00.00 grep scrip1
スクリプト用起動機使用&&
そして
ps -ef | grep "script1"
123 14644 1 0 2:08PM ?? 0:03.46 /PythonFolder/python ./script1.py
123 14652 14647 0 2:08PM ttys000 0:00.00 grep scrip1
~のため起動機スクリプトの使い方;
あるバージョンには2つのプロセスがあり、他のバージョンには1つしかないのはなぜですか? szhが実行される理由を理解しようとしています。起動機使用時にPythonスクリプトを実行するサブプロセスを作成します。&&私の起動スクリプトが次を使用すると終了するのはなぜですか?;Pythonスクリプトを単一のプロセスとして実行するようにします。
私が走るとき起動機使用されたスクリプトとして&&ターミナルアプリケーションが表示されて閉じますが、2つの実行中のプロセス(14679そして14680この場合)。
私が使うなら起動機スクリプトの使い方;python.pyプロセスを終了したいです。ただ呼び出します。
kill 14644
しかし、私が使うなら起動機使用されたスクリプト&&2つのプロセスを終了したいです。子プロセスを終了するか、親プロセスを終了すると、子プロセスが機能することがわかりました。
kill 14680
または
kill 14679; kill 14680
私も親プロセスを殺すことができることがわかりました。
kill 14679
私のPythonスクリプトは通常どおり実行され続けます。
ベストアンサー1
鍵はどのようにコマンドリスト#!/bin/bash
動作します(shebangラインを使用しているので、ここからBashマニュアルを引用してください):
リストは演算子 ';'、'&'、'&&'、または '||'いずれかで区切られ、オプションで ';'、'&'、または新しい行が先頭にある 1 つ以上のパイプシーケンスです。
これらのリスト演算子の中で、&&と||は同じ優先順位を持ち、次に同じ優先順位を持ちます。
(まだ残っています。管路|
または)で区切られた1つ以上のコマンドシーケンス|&
。
これは次のことを意味します。
cd /script1; nohup ./script1.py &
演算子間の優先順位規則のために、シェルcd /script1
はによって終了されたリストを確認し、;
「デフォルト」シェルで同期的に実行され、リストnohup ./script1.py
はによって終了し、&
生成された別のプロセスで非同期的に実行されます。
一方、
cd /scritp1 && nohup ./script1.py &
シェルはANDリストを確認しcd /scritp1 && nohup ./script1.py
て終了し、&
リスト全体を非同期的に実行します。これをbash
行うには、リスト自体を(バックグラウンドで)実行するための新しいプロセスを作成する必要があります。これは、Pythonスクリプト用の別々のプロセスを生成します。
情報kill
: 親プロセスの終了子プロセスは自動的に終了しません。。これは標準シェル動作です。 listの場合、&&
子プロセスを終了すると親プロセスが終了する可能性があります。親プロセスが実行するすべての操作は、子プロセスが返されるのを待っているためです。
nohup ./script1.py
成功に応じて条件付きで実行したい場合cd /script1
そしてANDリストのシェルの作成を防ぐには、2番目の要素大きな括弧:
cd /scritp1 && { nohup ./script1.py & }
または条件付きブロックを使用します。
if
cd /scritp1
then
nohup ./script1.py &
fi