ИМХО, ты в кул -де -мешке и нет возможности делать что хочешь таким образом.
Проблема в том, что ваша 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
Просто используйте цикл оболочки. Вы можете объединить две команды 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