Bash generic" ps aux " процесс по строгому имени



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



Поэтому я решил, что мне нужно использовать что-то вроде этого в моей тестовой процедуре:



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


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



Кроме того, если я удалю "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" вывод команды?



Есть идеи?

670   3  

3 ответов:

Первые $12 привязаны к тому, сколько полей выводит ps. Это не имеет никакого отношения к Башу.

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

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

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

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

Вот что-то быстрое и грязное, что выплюнет 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 so $NF-последнее поле.

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

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

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

И адаптирован с помощью ssh-агента a / grep

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

Я предлагаю grep для sth как '[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/. Решайте сами, что для вас лучше.

Comments

    Ничего не найдено.