Извлеките параметры кота из вывода PS

Существует несколько опций. Придерживаясь решения для цикличного выполнения, можно использовать read считать строку за один раз в переменную:

find . -name "*.pdf" | while IFS= read -r x
do
  echo pathname "$x"
done

Можно также использовать xargs -0 и find -print0 обработать любой вид специальных символов:

find . -name "*.pdf" -print0 | xargs -0 -L1 echo pathname
5
11.08.2014, 02:47
2 ответа

Если у вас есть / proc на вашем конкретном варианте * nix, вы можете вместо этого попытаться вытянуть из него нужные данные. Я думаю, что это может быть немного разумнее, чем пытаться продираться через утомительный синтаксический анализ вывода, предназначенного для чтения человеком.

Например, чтобы получить идентификатор пользователя, запустившего процесс tomcat , вы можете:

stat -c'%u' /proc/$(pgrep tomcat)/

Полагаться на доступность (и стандартизацию) / proc может быть даже больше хлопот в зависимости от вашего конкретного приложения / среды / ... Думаю, решать вам.

0
27.01.2020, 20:41

Передайте параметр -o в ps , чтобы управлять тем, какие поля он выводит. Если вы добавите знак = после всех полей, строка заголовка будет опущена.

Используйте -e вместо ax , чтобы придерживаться стандартных функций (это будет работать с любыми не-антикварными unix).

Ваш фильтр с grep не является надежным. Например, если вы запустите эту команду из сценария с именем look-for-tomcat , то ваш сценарий также будет сопоставлен. Вот более надежный способ поиска процесса JVM с аргументом org.apache.catalina.startup.Bootstrap .

ps -e -o user=,args= | awk '
    $2 ~ /java$/ &&  / org\.apache\.catalina\.startup\.Bootstrap($| ) {
        print "user name: ", $1;
        if (match($0, / -javaagent:[^ ]* /)) print substr($0, RSTART+1, RSTART+RLENGTH-2);
        # etc.
    }'

Еще лучше было бы записывать PID процесса tomcat в файл (например, /var/run/tomcat.pid ) при его запуске.

3
27.01.2020, 20:41

Теги

Похожие вопросы