2009-05-25 5 views
3

Предполагая, что я знаю PID процесса и хочу выполнить поиск в ps-A, как мне это сделать? Я пробовал это делать:Как выполнить поиск PID? (bash)

Это возвращает меня с длинным списком PID. Так как я могу получить использовать каждое отдельное значение выхода и сделать:

if [ "$PID" = "*each_value_in_search_list*" ]; then 
........ 

В этом случае я пытаюсь сравнить то, что входит пользователь с выходом моей команды, так как мне это сделать? Я делаю правильный путь в первую очередь? Или есть ли другой способ сделать это?

Спасибо за помощь, каждый, кто ответил на этот вопрос. (:.

+0

Я не понимаю, почему вы используете флаг '-v' для grep. –

+0

Я пытался удалить заголовок – Herves

ответ

4

ключ -v для Grep выполняет перевернутый поиска, другими словами, вы получите все, чего вы НЕ хотите. После того, как переменная установлена, вы также должны ссылаться на нее с префиксом $.

попробовать это

#!/bin/bash 

echo "Enter PID to search: " 
read PID 
search=$(ps --pid $PID -o comm=) 

if [ $search ] 
    then 
     echo "Program: $search" 
    else 
     echo "No program found with PID: $PID" 
fi 
+0

'--pid' не поддерживается на BSD' ps'. опция '-p' кажется предпочтительной. –

3

Вы вывод оглавления из ps для всех линий, которые не содержат буквальную строку «PID» Вы хотите использовать $PID вместо того, чтобы использовать переменной именем PID вместо буквального «PID». Кроме того, так как вы не хотите ложных срабатываний на других областях, соответствующих PID, просто совпадают по первому столбцу:

search=$(ps -A | grep "^ *$PID\>" | awk '{print $1}') 

"\>" последовательность символов совпадает с пустой строкой в ​​конце слова

Some. версии ps поддержка -p вариант только дать вам информацию о конкретных PID, так что вам не нужно Grep или AWK:

search=$(ps -p $PID) 
+0

POSIX ps поддерживает опцию -p - так что хорошо, что вы не найдете ps на достаточно обновленной машине, которая не поддерживает его. :) – dannysauer

3

Вашего "grep -v PID" стандартный трюк, чтобы удалить строку заголовка, а не способ, чтобы получить фактический PID детали от выхода.

Если все вы хотите детали для этого процесса, просто используйте:

search=$(ps -A | awk -v pid=$PID '$1==pid{print pid}') 

Это установит поиск в PID в вопросе, если он существует, или пустая строка, в противном случае, что и вы, кажется, хотите ,

Проблема с выполнением слепого поиска PID (в отличие от проверки столбца 1 с помощью awk) заключается в том, что вы можете выбирать линии, в которых этот ПИД-код отображается в командной строке.

2

Если корень вопроса - проверить, соответствует ли введенный PID записи процесса (root). Более конкретно, если вы в состоянии послать сигнал этого процесса (пользователь):

if kill -0 $PID >/dev/null 2>&1; then ... 

Это может быть, конечно, что это не совсем то, что вы хотите. Я поспешил «немного интерпретировать» ваш вопрос;)

0
<?php 
echo shell_exec("ps -Ao cmd,pid|grep -P ' {$pid}$'"); 
?> 
Смежные вопросы