2012-07-02 3 views
0

В сценарии оболочки позволяет сказать, что я выполнить команду, как этотShell сценариев получения команды PID

for i in `ps -ax|grep "myproj"` 
do 
    echo $i 
done 

Здесь команда Grep будет выполнена в виде отдельного процесса. Тогда как я могу получить его PID в сценарии оболочки?

+0

Что вы бы описали своего PID, если нашли? К моменту его поступления команда завершена, поэтому PID перестает действовать. –

+0

Предположим, я получу его в цикле для сравнения с некоторым значением? – Cygnus

ответ

1

Я выхожу на конечность здесь и понимаю, что это больше похоже на комментарий.

Зачем вам нужен PID команды grep?

В своем комментарии вы говорите, что хотите сравнить его в цикле с чем-то. Я бы предположил, что это ваша проблема, что цикл будет (иногда) включать не только myproj, но и пункт о вашей команде grep? Если да, то попробуйте следующее:

for i in `ps -ax | grep -v grep | grep "myproj"` 
    do 
     echo $i 
    done 

Переключатель -v в основном переворачивает картину, так grep -v grep (или grep -v "grep", который, возможно, выглядит немного менее неудобно) будет включать в себя только те строки, которые не содержат строку «Grep» (см. man grep). Обратите внимание, что это может быть слишком неопределенным для некоторых случаев, например, если шаблон, который вы на самом деле ищете, также содержит строку «grep». Например, следующее может не работать так, как вы ожидали: ps -ax | grep -v grep | grep mygrepling

Однако, в вашем конкретном случае, где вы ищете только «myproj», это будет сделано.

Или вы могли бы просто использовать

for i in `ps -ax | grep "my[p]roj"` 
    do 
     echo $i 
    done 

Таким образом, нет необходимости знать PID команды Grep, потому что он просто никогда не показывает, как итерации цикла.

+0

OK .. что делает -v-переключатель с grep? – Cygnus

+0

Спасибо! Это решило проблему :) – Cygnus

1

При запуске процесса в фоновом режиме, вы можете получить его PID в $!

$ ps aux | grep dddddd & echo $! 
[1] 27948 
27948 
ic  27948 0.0 0.0 3932 760 pts/3 R 08:49 0:00 grep dddddd 

Когда на переднем плане --- процесс больше не существует в точке, где вы хотите, чтобы найти его PID. Когда вы находитесь в цикле, оператор for уже выполнен и grep уже завершен, так что вы больше не можете найти его PID.

+0

Спасибо! Я должен запустить его в фоновом режиме, чтобы получить его PID. :) – Cygnus

+0

Конечно, вы можете это сделать, но могут быть и другие способы решения вашей задачи. Запустите grep в фоновом режиме и найдите его PID, ну ... это немного странно :) –

Смежные вопросы