Процесс Groovy не работает с оболочкой Linux (grep, awk и ps)

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;

Итак, что я пытаюсь сделать, так это ps скрипт оболочки, который я сделал (sleep.sh) [все, что он делает, это спит в течение определенного периода времени]. Не совсем уверен, как это сделать. Это было мое лучшее предположение ^^

результат:

-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 Также я пробовал с кавычками и без них в заводном скрипте. Не думал, что это будет иметь значение, но стоит попробовать


person Ian    schedule 24.05.2013    source источник
comment
чтобы держать вас в курсе, я также попробовал awk '{println $2}', и это не очень хорошо сочеталось с отличным синтаксисом. но я не знаю, как изменить это, чтобы хорошо играть с Groovy. (относительно новый для Groovy)   -  person Ian    schedule 24.05.2013
comment
Вы хотите, чтобы ваш скрипт знал, какой у него идентификатор процесса? Было бы лучше, если бы вы прямо указали, чего вы хотите, чтобы ваш скрипт достиг.   -  person Rob Kielty    schedule 25.05.2013
comment
да, я хочу знать pid sleep.sh   -  person Ian    schedule 28.05.2013


Ответы (1)


Параметр оболочки -c принимает только один параметр. Попробуйте это из командной строки, и вы также увидите, что это не работает:

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
person ataylor    schedule 27.05.2013