Bashはnohupプログラムの子プロセスを生成します。代わりに && を使用します。

Bashはnohupプログラムの子プロセスを生成します。代わりに && を使用します。
  • 私は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

おすすめ記事