Primeiro, sim, eu já vi essa pergunta:
Encontre (e mate) processos antigos
As respostas estão incorretas e não funcionam. Votei e comentei em conformidade.
Os processos que eu quero matar são assim quando listados com ps aux | grep page.py
:
apache 424 0,0 0,1 6996 4564? S 07:02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2686 0,0 0,1 7000 3460? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2926 0,0 0,0 6996 1404? S Sep02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 7398 0,0 0,0 6996 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 9423 0,0 0,1 6996 3824? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 11022 0,0 0,0 7004 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15343 0,0 0,1 7004 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15364 0,0 0,1 7004 3792? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15397 0,0 0,1 6996 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 16817 0,0 0,1 7000 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 17590 0,0 0,0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 24448 0,0 0,0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 30361 0,0 0,1 6996 3776? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
Eu estou olhando para configurar um cron diário simples que irá encontrar e matar todos os page.py
processos anteriores a uma hora.
A resposta aceita na pergunta mencionada não funciona, pois não corresponde a um intervalo de vezes, simplesmente corresponde a processos que foram executados de 7 dias a 7 dias 23 horas 59 minutos e 59 segundos. Não quero matar processos em execução de uma a duas horas, mas algo maior que 1 hora.
A outra resposta para a pergunta acima mencionada find
não funciona, pelo menos não no Gentoo ou no CentOS 5.4, ou gera um aviso ou não retorna nada se a recomendação desse aviso for seguida.
Graças à resposta de Christopher, pude adaptá-lo ao seguinte:
-mmin
foi o comando find que estava faltando.fonte
find /proc -maxdepth 1 -type d -name 1 -mmin +60 -ls
- / sbin / init não está sendo listado apesar das contagens de tempo de atividade por dias, não horas. Parece que você não pode confiar no tempo de modificação de diretórios do / proc /.find nem sempre funciona, nem todo sistema tem etimes disponíveis, e pode ser o meu status regex newb, mas acho que você não precisa de nada além disso:
você pode canalizar isso para matar ou qualquer que seja sua necessidade.
fonte
ps
, mas eu dobraria os múltiplosgrep
s no únicoawk
e, por segurança, restringiria as correspondências de padrões a colunas específicas (para excluir, por exemplo, um nome de comando correspondente )Se você quiser, pode alimentar
ps
com a lista de PIDs a serem pesquisados, por exemplo:fonte
etimes
funciona apenas para os mais novosps
Acho que você pode modificar algumas dessas respostas anteriores para atender às suas necessidades. Nomeadamente:
Ou
Eu acho que o segundo pode melhor atender às suas necessidades. A versão find acabaria com outros processos desse usuário -
Christopher Karel
fonte
kill -9
exceto como último recurso. Use-SIGINT
ou-SIGTERM
.ps
produzirá a hora no^..:..$
formato quando for menos de uma hora.fonte
psmisc
utilitário? O OP mencionou o CentOS; está disponível como um RPM?O problema
Convertendo a
etime
coluna deps
comando (tempo decorrido) em segundos. A especificação de hora está neste formato[[dd-]hh:]mm:ss
. As versões mais recentes dops
têm umaetimes
coluna que geraetime
valor em segundos.A solução: função awk personalizada simples
Esta função personalizada do awk suporta todos os formatos de
etime
coluna (por exemplo03-12:30:59
,00:07
etc.). Basta colá-lo no seu script awk, é uma solução amigável para uma só pessoa.sec(T)
converte T em segundosT
especificação de tempo em[[dd-]hh:]mm:ss
formato (por exemploetime
)C
contagem de campos emT
(equivalente à variável NF do awk)A
matriz de campos emT
(equivalente à variável $ do awk)A[C>3?C-3:99]
essa é uma maneira segura de fazer referência ao quarto valor (ou seja, 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, desreferenciará oA[99]
que produzirá0
valor. Suponho que99
seja alto o suficiente para a maioria dos casos de uso.Exemplo do mundo real
Esse bash oneliner interromperá o
soffice.bin
processo em execução no usuário atual se o processo tiver mais de 180 segundos.fonte
O
lstart
campo emps
fornece um formato de hora consistente que podemos alimentardate
para converter em segundos desde a época. Depois, comparamos isso com o horário atual.fonte
Modifiquei a resposta que eles deram no post anterior
A expressão regular procura 2 tipos de segundo argumento:
Hours:minutes:seconds
expressão.Isso deve corresponder a tudo, exceto processos jovens que teriam a forma
minutes:seconds
.fonte
Provavelmente é um exagero, mas fiquei curioso o suficiente para finalizá-lo e testar se ele funciona (em um nome de processo diferente no meu sistema, é claro). Você pode matar a captura
$user
e$pid
simplificar o regexp, que eu adicionei apenas para depuração, e não senti vontade de voltar. As capturas nomeadas do perl 5.10 eliminariam mais algumas linhas, mas isso deve funcionar em perls mais antigos.Você precisará substituir a impressão por uma morte, é claro, mas eu não estava disposto a matar nada no meu próprio sistema.
fonte
Eu tenho um servidor com datas erradas em / proc e encontrar não funciona, então eu escrevi este script:
fonte
Versão Python usando o ctime das entradas do processo em
/proc
:fonte
Eu uso esse script simples que leva dois argumentos, nome do processo e idade em segundos.
fonte
isso deve funcionar
killall --older-than 1h $proc_name
fonte
--older-than
e é fácil ignorar. Comparado com as outras respostas, isso é muito mais fácil e também está disponível agora no EL7.Eu não estava satisfeito com a outra solução, a maioria delas é muito enigmática (meu conhecimento do bash é meio limitado) e, portanto, não posso personalizá-las ...
Eu criei minha própria solução, provavelmente não é a melhor, mas funciona e é legível
Você pode salvar esse script em um arquivo e torná-lo executável (eventualmente, chame-o usando cron)
fonte
72 = 3 dias 48 = 2 dias 24 = 1 dia
funciona :)
fonte