2013-05-09 3 views
3

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

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

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

Мой вопрос: Будет ли AWK $ 12 работы на любом/Linux окр UNIX с помощью Баша с любыми версиями Баша?

Кроме того, если удалить "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»?

Любая идея?

+0

Будет ли «pgrep ssh-agent» достаточным или вам действительно нужна информация, которую 'ps' вам даст? – timss

+0

Или даже 'ps aux | grep -f <(pgrep ssh-agent) '(: – Rubens

+0

Мне нужно только имя PID и процесс, вот и все. Тем не менее, я запускаю этот скрипт на разных unix/linux. Я просто протестировал pgrep на AIX и, конечно же, это не Я предпочел бы, чтобы он был как можно более общим, используя только чистый grep. – trox

ответ

2

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

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-agent

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

2

Первые $ 12 привязаны к количеству выходов ps. У него нет ничего общего с bash.

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

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

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

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

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

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 является последним полем.

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

+0

Огромное спасибо! $ NF, что я искал. о grep -v grep, я знал, что, как бы ни было неудобно, что вы не могли реально разграничить команду ps ... Просто скажите. – trox

+0

ps aux | gr ep ssh-agent | AWK '{печать $ 1 "" $ NF}' Foo SSH-агент Foo SSH-агент и должен возвращать: Foo SSH-агент Foo Grep SSH-агент – trox

+0

woopp хехе заменить $ 1 с $ 2 .. или независимо от того, что или не использовать. Это был всего лишь пример –

1

Я предлагаю 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/. Решите для себя, что лучше для вас.

+0

с использованием/proc файловой системы, как правило, несовместим с сценарием. что если он захочет переместить этот сценарий на BSD или в солярис или что-то еще? Вы, по сути дела, делаете в своем цикле, что делает ps в Linux (он читает/proc) и, вероятно, делает плохую работу, потому что ps действительно будет выполнять другие тесты, например. чтобы вы не получили разрешение на отказ в уродстве для процессов, к которым у вас нет доступа –

+0

Как я уже сказал, то, что ему подходит, зависит от его (не упоминаемых) обстоятельств. Чтобы зависеть от того, что эта конкретная реализация ps печатает имя команды в 12-м столбце, также может быть слишком много. – Alfe

+0

Да, спасибо, Альф, я также попробую ваш метод. Я думаю, что/proc не для меня, потому что, как сказано, я хочу, чтобы мой скрипт в основном работал на чем-то без видимости. – trox

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