Объединение двух команд, т. е. вывод первой в качестве ввода второй команды

ИМХО, ты в кул -де -мешке и нет возможности делать что хочешь таким образом.

Проблема в том, что ваша TIMEинформация устарела, потому что, возможно, свойство TIMEэтих процессов изменилось во время работы скрипта. Пара TIME, CMDне может идентифицировать процесс.

Почему вы делаете awk '{print $7, $8}'? В этот момент вам не нужен CMD, вам нужен только PIDдля идентификации процесса, поэтому просто измените его на awk '{print $7, $2}'.

Вы можете изменить свой код следующим образом, чтобы вывести PIDпроцессов, которые вы ищете:

ps -eaf \
| awk '{print $7, $2}' \
| sort -n \
| grep -v TIME \
| grep -v 00:00:00 \
| awk -F ":" '{if ( $2 >= 01 ) print}' \
| awk '{print $2}'

Кроме того, в вашем коде есть небольшая ошибка :, что произойдет, если процесс имеет 04:00:23как TIME? Ваш код пропустит его, потому что проверяет только поле минут в TIME. Вы можете исправить это так:

ps -eaf \
| awk '{print $7, $2}' \
| sort -n \
| grep -v TIME \
| grep -v 00:00:00 \
| awk -F ":" '{if (( $1 >= 01 ) || ( $2 >= 01 )) print}' \
| awk '{print $2}'

Несколько советов по улучшению ваших навыков:

  • Вы должны проверить опцию -oв psи опцию -Fв awkи, возможно, значение столбца TIMEв ps.
  • Попробуйте понять, как работает следующая строка:

    ps -eo time,pid --no-headers | awk -F '[ :]*' '$1>0 || $2>0 {print $4}' | xargs kill
    
1
23.11.2020, 15:21
1 ответ

Просто используйте цикл оболочки. Вы можете объединить две команды grepв одну, и нет смысла передавать genpwdfile, если она создает файл. Попробуйте это:

genpwdfile dec -in test/test.cfg -out /tmp/dec.out &&
    grep -E 'PORT_NUM|MONITOR_PORT' /tmp/dec.out | cut -d '=' -f2 |
        while read -r port; do
            lsof -i:"$port" 2>/dev/null | 
                awk 'NR>1{print $2}' 
        done | xargs kill -9 
1
18.03.2021, 22:47

Теги

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