最初のコマンドはあいまいです。私はそれがあなたが説明することを確実に行うとは思わない。また、最初の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
。より短いコマンドがありますが、これはより移植性が高いと思います。より具体的にしたい場合は、実際のコードを提供してください。