0

奇妙な問題があります。頭がよくわかりません。私がしているのは、基本的に bash コードを呼び出すだけの fn_rundumper という関数を実行することです。

pterm -z "cmd.sh" param1 &

バックグラウンド pid "27938858" を含む出力は次のとおりです。

fn_rundumper
running fn_dumper...
[1] 27938858
fn_dumper...done

次に、実行中のジョブ番号を見ると、PID「27938858」も示されています。

jobs -l
[1] + 27938858 Running              $(pterm -z "$SCRIPTS_DIR/run_dumper.sh" $VO

次に、何が実行psされているかを確認するコマンドを実行します。pterms

ps | grep pterm
 24285189 ?        00:00:00 pterm
 27938859 ?        00:00:00 pterm

これにより PID が得られます27938859。ここが他と違う!

PID を強制終了27938858しても、何も起こらないようです。PID を強制終了27938859すると、バックグラウンドptermが閉じられます。

問題は、多くの異なるバックグラウンド pterm と、バックグラウンド タスクとして開かれていない (つまり、個別に実行される) 一部の pterm を実行したい場合があることです。そのため、整理するときは、スクリプトを介して開いた pterms を閉じたいだけです。

閉じる必要がある PID を確認するために使用しようとしてjobs -lいましたが、先ほど説明したように、これは間違った PID です。

なぜこれが起こるのか誰か説明できますか?また、正しいPIDを取得するために何をする必要がありますか? ありがとう!

- 編集1 -

私が考えることができる最善の方法は、ps | grep pterm前と後を実行し、結果を比較して新しい pterm PID を見つけることです...実行可能ですが、醜い:(

- 編集2 -

コマンドラインでこれを再度テストしました(関数呼び出しなし):

最初に私がした:

`pterm -z "$VOE_SCRIPTS_DIR/run_dumper.sh" $PROJECT_DIR` &

そして、ps / $!結果を見て、同じ動作を得ました。

それから私はしました:

pterm -z "$VOE_SCRIPTS_DIR/run_dumper.sh" $VOE_PROJECT_DIR &

つまり、バックティックが削除され、PID がすべて一致するようになりました。コードからバックティックを削除できると思いますが、それが何なのかよくわかりません!

4

1 に答える 1

2

またはバッククォート (コマンド置換) を使用$()すると、サブシェルが作成されます。27938858サブシェルの PID も同様で、これは PID で呼び出さptermれます27938859

あなたの例ではコマンド置換は役に立たないように見えるので、単に削除する必要があります。

于 2015-02-02T10:49:59.940 に答える