Поиск процесса по строке аргумента - PullRequest
0 голосов
/ 03 июля 2019

Я использую ps, grep и sed, чтобы попытаться идентифицировать некоторые процессы Java, которые однозначно идентифицируются каким-либо конкретным аргументом, например -DAppService=DDDABC_456 или -DAppService=DDDXYZ_456_cazorla.Я хочу вернуть список через запятую: PID,argument,process

Я работаю над CentOS7.Пока я на полпути вниз, но запутался.

Я стреляю из-за этого:

1234,-DAppService=DDDABC_456,/usr/java/jdk1.8.0_112/bin/java
2345,-DAppService=DDDABC_456_cazorla,/usr/java/jdk1.8.0_112/bin/java
3456,-DAppService=DDDXYZ_789,/usr/java/jdk1.8.0_112/bin/java
4567,-DAppService=DDDXYZ_789_cazorla,/usr/java/jdk1.8.0_112/bin/java

Обратите внимание, что аргумент может иметь или не иметь суффиксиз "_cazorla".

Я пробовал это, но он теряет аргументы (и число аргументов может варьироваться, поэтому я не думаю, что я могу продолжить с $ 9, $ 10 и т. д.):

ps -ef | grep DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)? | grep -v grep | awk '{OFS=","; print $2,$8}'

Дает мне:

1234,/usr/java/jdk1.8.0_112/bin/java
2345,/usr/java/jdk1.8.0_112/bin/java
3456,/usr/java/jdk1.8.0_112/bin/java
4567,/usr/java/jdk1.8.0_112/bin/java

Также эта запятая разделяет все результаты столбца grep и все аргументы, которые мне не нужны:

ps -aef | grep DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)? | grep -v grep | sed -e "s/\s\+/,/g"

Слишком много фактического результатаперечислить здесь, но, например,

user,1234,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
user,2345,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
user,3456,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
user,4567,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...

Мои знания в области sed довольно скудны (как и в случае с awk, но в качестве опции это тоже возможно).Когда я доволен командами, я хочу поместить их в скрипт bash, который я могу вызывать из других мест.

1 Ответ

0 голосов
/ 03 июля 2019
ps -eo pid=,args= |\
awk '
    {
        for (i=3; i<=NF; i++)
            if ($i ~ regex) {
                print $1, $i, $2
                next
            }
    }
' OFS=, regex='awk re to match arg'
  • попросить ps вывести только pid, а в командной строке
  • указать регулярное выражение для awk и проверить каждый аргумент (поля с 3 по NF) на совпадение
  • если найдено, выходной pid ($1), команда ($2) и соответствующий аргумент ($i)

Примечания:

  • awk не может отличить cmd "arg1 with spaces" от cmd arg1 arg2 arg3, но это может не иметь значения
  • пробелов в команде (например, в имени каталога в пути)вызовет усечение команды с первым пробелом
  • запятых в команде (или соответствующий аргумент) прервет вывод csv
...