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" вывод команды?
Есть идеи?
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