O problema
Convertendo a coluna etime (tempo decorrido) do comando ps para segundos. A especificação de hora está neste formato [[dd-]hh:]mm:ss . Versões mais recentes de ps têm uma coluna etimes que gera etime em segundos.
A solução: função awk personalizada simples
Esta função awk personalizada suporta todos os formatos da coluna etime (por exemplo, 03-12:30:59 , 00:07 etc.). Basta colá-lo em seu script awk, é uma solução amigável de uma linha.
function sec(T){C=split(T,A,"[:-]"); return A[C>3?C-3:99]*86400 + A[C>2?C-2:99]*3600 + A[C>1?C-1:99]*60 + A[C>0?C-0:99]*1}
-
sec(T) converte T em segundos
-
T especificação de tempo em [[dd-]hh:]mm:ss format (por exemplo, etime )
-
C contagem de campos em T (equivalente a variável NF do awk)
-
A matriz de campos em T (equivalente à variável $ do awk)
-
A[C>3?C-3:99] esta é uma maneira segura de referenciar o quarto valor (ou seja, o número de dias) na ordem inversa. Essa abordagem é útil porque dias e horas são opcionais. Se a matriz não for longa o suficiente, será cancelada a referência A[99] , que renderá 0 valor. Eu assumo que 99 é alto o suficiente para a maioria dos casos de uso.
- retorna segundos como inteiro
Exemplo do mundo real
Esse basel oneliner matará o processo soffice.bin em execução no usuário atual se o processo tiver mais de 180 segundos.
kill -9 $(ps cx -o command,etime,pid | awk '/^soffice.bin/ {if (sec($2)>180) {print $3}} function sec(T){C=split(T,A,"[:-]"); return A[C>3?C-3:99]*86400 + A[C>2?C-2:99]*3600 + A[C>1?C-1:99]*60 + A[C>0?C-0:99]*1}')