Bash общий ps aux процесс по строгому имени

Я пытаюсь получить команду ps aux, отображающую только реальный процесс ssh-agent. Я заметил, что в некоторых дистрибутивах у меня появляются нежелательные процессы, такие как цвета команд и тому подобное. Мне нужно сделать это, потому что мне нужно убедиться, что реальный процесс ssh-agent запущен в сценарии (не беспокойтесь, у меня уже есть цикл для этого...).

Итак, я понял, что мне нужно использовать что-то подобное в моей тестовой программе:

#!/bin/bash
ps aux | grep ssh-agent | grep -v grep | awk '{print $12}'

Мой вопрос: будет ли работать awk $12 на любой среде unix/linux, использующей bash, с любыми версиями bash?

Кроме того, если я удалю «grep -v grep» и сделаю это:

ps aux | grep ssh-agent | awk '{print $12}'

вывод:

ssh-agent
ssh-agent

В настоящее время:

ps aux | grep ssh-agent

вывод:

foo 18153478  0.0  0.0  536  844      - A      Apr 25  0:00 ssh-agent
foo 31260886  0.0  0.0  252  264  pts/0 A    22:38:41  0:00 grep ssh-agent

Это означает, что пробел между «grep ssh-agent» интерпретируется командой awk как разделитель. Можно ли это преодолеть? Я уже пытался использовать разделитель табуляции, но это не так. Кажется, что разделителем команды являются простые символы пробела. Можно ли применить разделители табуляции для вывода команды «ps»?

Есть идеи?


person trox    schedule 09.05.2013    source источник
comment
Будет ли достаточно pgrep ssh-agent или вам действительно нужна информация, которую вам предоставит ps?   -  person timss    schedule 10.05.2013
comment
Или даже ps aux | grep -f <(pgrep ssh-agent) (:   -  person Rubens    schedule 10.05.2013
comment
Мне нужен только PID и имя процесса, вот и все. Однако я запускаю этот скрипт на разных unix/linux. Я только что протестировал pgrep на AIX, и, конечно же, он не установлен. Я бы предпочел, чтобы он был как можно более общим, используя только чистый grep.   -  person trox    schedule 10.05.2013
comment
Вы можете рассмотреть возможность использования grep [s]sh-agent или аналогичного, чтобы предотвратить самосопоставление, тем самым избегая grep -v grep.   -  person martin clayton    schedule 10.05.2013
comment
Кроме того, обратите внимание на параметр -o для ps, вы можете использовать его для форматирования вывода, чтобы получить то, что вам нужно.   -  person martin clayton    schedule 10.05.2013
comment
Спасибо, Мартин, за хороший совет, я обязательно извлеку из него уроки.   -  person trox    schedule 10.05.2013


Ответы (3)


ОК, я думаю, я нашел это, действительно легко и просто:

ps -e -o pid,comm | grep ssh-agent

Работает просто отлично.

Ответ найден здесь: https://unix.stackexchange.com/questions/22892/how-do-use-awk-along-with-a-command-to-show-the-process-id-with-the-ps-command/22895#22895

И адаптирован с | grep ssh-агент

Также предложено Мартином. Спасибо всем за то, что поделились своим опытом!

person trox    schedule 09.05.2013

Первые 12 долларов привязаны к тому, сколько полей выводит ps. Это не имеет ничего общего с bash.

grep -v grep — хороший способ удалить процесс grep, так что оставьте его;

Теперь вы не уверены, является ли последнее поле полем 12 или чем-то еще, я не совсем уверен

ps aux | grep ssh-agent | grep -v grep | awk '{ print $NF }' 

предполагая, что вы хотите видеть только ssh-agent (и у него нет параметров командной строки)

Вот что-то быстрое и грязное, которое выдаст pid и полную командную строку

ps aux | grep ssh-agent | grep -v grep | awk '{ print $1 " "; for (k = 12; k < NF; k++ ) { printf "%s", k; } printf "\n"; }' 

NF — это количество полей в awk, поэтому $NF — последнее поле.

посмотрите, работает ли это для вас. Однако есть гораздо более чистые способы сделать это.

person Ahmed Masud    schedule 09.05.2013
comment
Большое спасибо! $NF, что я искал. о grep -v grep, я знал это, однако это казалось немного неудобным, что вы не могли правильно разграничить команду ps... Просто говорю. - person trox; 10.05.2013
comment
PS вспомогательный | grep ssh-агент | awk '{ print $1 $NF }' foo ssh-agent foo ssh-agent и должен вернуть: foo ssh-agent foo grep ssh-agent - person trox; 10.05.2013
comment
woopp хе-хе замените $1 на $2 .. или что-то еще, или не используйте это .. это был просто пример - person Ahmed Masud; 10.05.2013
comment
Конечно, спасибо, ваш ответ очень помог. Мне это нравится, и я думаю, что это будет работать на любом Unix/Linux. $NF должен помочь. Жаль, что я не знал об этом :) - person trox; 10.05.2013
comment
;-) Раньше я преподавал программирование оболочки, и я разработал курс для него давным-давно (более 15 лет назад). Я думаю, что кое-что из того, что я преподавал, на самом деле осталось со мной, хе-хе-хе - person Ahmed Masud; 10.05.2013

Я предлагаю grep за что-то вроде '[s]sh-agent'. Таким образом вы предотвратите получение самого grep.

Я также предлагаю не использовать awk (для печати 12-го столбца), а использовать cut для печати определенного диапазона символов строк, например. грамм.:

ps aux | grep '[s]sh-agent' | cut -c 66-

Конечно, это зависит от выходного формата ps.

Вместо этого вы можете взглянуть на файловую систему /proc/:

(
  cd /proc
  for p in [0-9]*
  do
    [ "$(readlink $p/exe)" = "/bin/bash" ] &&
      echo "$p $(cat $p/cmdline | tr '\0' ' ')"
  done
)

(Конечно, лучше использовать sth вместо /bin/bash.)

Это, с другой стороны, будет зависеть от наличия файловой системы /proc/. Решайте сами, что для вас лучше.

person Alfe    schedule 09.05.2013
comment
использование файловой системы /proc обычно несовместимо со сценарием. что, если он захочет переместить этот скрипт на машину BSD, или на Solaris, или на что-то еще? По сути, вы делаете в своем цикле for то, что ps делает в Linux (он читает /proc), и, вероятно, плохо справляетесь с этим, потому что ps на самом деле выполняет другие тесты, например. faccess, поэтому вы не получите безобразие Permission Denied для процессов, к которым у вас нет доступа - person Ahmed Masud; 10.05.2013
comment
Как я уже сказал, то, что ему больше подходит, зависит от его (не упомянутых) обстоятельств. Зависеть от того факта, что эта конкретная реализация ps печатает имя команды в 12-м столбце, также может быть слишком много. - person Alfe; 10.05.2013
comment
Да, большое спасибо Альфе, я тоже попробую ваш метод. Я предполагаю, что /proc не для меня, потому что, как уже говорилось, я хочу, чтобы мой скрипт в основном работал на чем угодно без видимых причин. - person trox; 10.05.2013
comment
Сложная задача, т. Действительно: настоящий переносимый код не пишется в оболочке ;-) - person Alfe; 10.05.2013
comment
Что ж, думаю, я сделаю все возможное :) Портативность для меня очень важна. По личному мнению, код не стоит переписывать/адаптировать. Извините, я из мира Java ^^ - person trox; 10.05.2013
comment
Как насчет использования C или Python для этого? ;-) - person Alfe; 10.05.2013
comment
Почему не Python на самом деле. Я посмотрю на это. Еще раз большое спасибо за всемерную помощь! Сообщество Stackoverflow Rox! - person trox; 10.05.2013