0
Process proc1 ='sh -c ps -ef'.execute();
Process proc2 ='sh -c grep sleep.sh '.execute();
Process proc3 ='sh -c grep -v grep '.execute();
Process proc4 ='sh -c awk sleep.sh '.execute();

Process all = proc1 | proc2 | proc3 | proc4;

// I tried this too and this didnt work

//println( [ 'sh', '-c', 'ps -ef | grep "sleep.sh" | grep -v "grep" |     awk "sleep.groovy" ' ].execute().text )

//also tried without the awk

println all.text;

さて、私がやろうとしているのは、私が作成したシェルスクリプト(sleep.sh)をpsすることです[一定期間スリープするだけです]。それを行う方法がよくわかりません。これが一番の推しでした^^

結果:

-sh-3.2$ ./callGroovy.sh testSleep.groovy


-sh-3.2$

何も出力せず、何も与えません (callGroovy は、Groovy スクリプトを呼び出すために使用するシェル スクリプトです) パイプされたコマンドを実行すると、awk 以外は引き続き動作します。

-sh-3.2$ ps -ef | grep "sleep.sh" | grep -v "grep"
wasadmin ***** *****  0 **:** pts/1    **:**:** /bin/bash ./sleep.sh  

(*はすべて数字です)

grep と ps だけでスクリプトを試しても、この出力は得られません。助言がありますか?..PS また、groovy スクリプトで引用符の有無にかかわらず試してみました。それが違いを生むとは思わなかったが、試してみる価値がある

4

1 に答える 1

1

シェル-cオプションは、1 つのパラメーターのみを想定しています。コマンドラインからこれを試してみてください。失敗することもわかります。

sh -c ps -ef | sh -c grep sleep.sh | sh -c grep -v grep | sh -c awk sleep.sh

正しく機能するには引用符が必要です。

sh -c "ps -ef" | sh -c "grep sleep.sh" | sh -c "grep -v grep" | sh -c "awk sleep.sh"

文字列の代わりに文字列のリストから始めることで、コマンドを適切に引用できます: proc1 = ['sh', '-c', 'ps -ef']. この場合、groovy でフィルタリングを行っているため、簡単な解決策は、シェルからコマンドを呼び出さないことです。これを試して:

Process proc1 ='ps -ef'.execute()
Process proc2 ='grep sleep.sh '.execute()
Process proc3 ='grep -v grep '.execute()
Process proc4 ='awk sleep.sh '.execute()

Process all = proc1 | proc2 | proc3 | proc4

println all.text

最後に、正常に動作しない場合は、stderr ストリームを次のように読み取ると役立ちます。

println all.err.text
于 2013-05-27T15:34:01.717 に答える