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}')