0

手動で実行されたターミナルで動作するシェルスクリプトを介して、いくつかの複雑なgrepコマンドを実行しようとしています。なぜこれが機能しないのか、私の人生では理解できません。最初の grep の目的は、親 myPattern に関連付けられているプロセス ID を取得することです。2番目は、プロセスmyPatternのプロセスIDを取得します

現在、私のシェル スクリプトは 1 回目は何も返しません。2番目の「grep -v 'grep'」の部分は無視します。

#!/bin/sh

ps -ef | grep "$(ps -ef | grep 'myPattern' | grep -v grep | awk '{print $2}')" | grep -v grep | grep -v myPattern | awk '{print $2}'
ps -ef | grep 'myPattern' | grep -v 'grep' | awk '{print $2}'

これは、ターミナルで手動で実行すると正常に機能します。私がこれを詰め込んだアイデアはありますか?

4

1 に答える 1

0

最初のコマンドはあいまいです。私はそれがあなたが説明することを確実に行うとは思わない。また、最初のgrep呼び出しのIDを取得することを防ぎません。2つ目は私のために働きます。拳のクエリの場合、使用しているシステムによって大きく異なります。pstreeを使用すると、プロセスツリー全体をpidの下に表示する方が簡単です。好き:

pstree -p 1782 | sed 's/-/\n/g' | sed -n -e 's/.*(\([0-9]\+\)).*/\1/p'

pidを単一の値に制限する必要があります。より多くの値がある場合は、それらをループする必要があります。pstreeがない場合は、psの周りにループを作成できます。現在のコマンドが機能したとしても、thwyは1つのレベルの親子関係のみをキャッチすることに注意してください。pstreeは任意のレベルを実行します。

また、プロセスはフォークすることで元の親を親プロセスとしてエスケープできることも伝えなければなりません。

いずれにせよ、あなたが何を達成しようとしているのか、そしてその理由、そしてどのプラットフォームであなたに素晴らしい答えを与えるのは難しいのか、正確な詳細がなければ。また、これらのユーティリティは、事実上どこにでも存在しますが、思ったほどポータブルではありません。

もう1つ注意してください-/bin/ shは、多くの場合、現在のシェルではありません。多くのLinuxシステムでは、ユーザーはデフォルトのbashシェルを使用しており、/ bin/shはdashまたはその他のシェルバリアントです。したがって、コンソールとスクリプトにあるものとの差分が表示される場合は、使用している実際のシェルとは異なる可能性があります。

ユーザーのフィードバックに基づくと、Javaプロセス起動スクリプトに次のようなものを含める方がはるかに簡単です。

java <your params here> &
echo $! > /var/run/myprog.pid

その場合、killスクリプトはのようになりますecho /var/run/myprog.pid | xargs kill。より短いコマンドがありますが、これはより移植性が高いと思います。より具体的にしたい場合は、実際のコードを提供してください。

于 2013-02-26T09:02:58.960 に答える