Como matar todos os processos que possuem datas mais antigas que hoje?

1

Eu emito o comando ps -aux | grep tony . Exibe a seguinte saída

tony    10986  0.0  0.0  33532   464 ?        S    Feb01   0:00 vncconfig -iconic
tony    10988  0.0  0.0  86012   512 ?        S    Feb01   0:00 twm
tony    15553  0.0  0.0  92404  1848 ?        S    10:34   0:00 sshd: tony@pts/34
tony    15554  0.0  0.0  66232  1680 pts/34   Ss+  10:34   0:00 -bash

Eu gostaria de matar todos os processos mortos que têm datas mais antigas que hoje.

Eu poderia ter emitido o comando kill -9 10986 ; kill -9 10988 , mas eu gosto de executar em um comando e também há muitos processos mortos pendentes.

Qualquer ajuda seria muito apreciada.

    
por Tony 11.02.2011 / 04:13

4 respostas

4

Primeiro, preste atenção em O conselho de Jonathan

Agora que você fez isso, tente algo assim

# Find all process that are owner by "tony"
#  - Print out the process id (pid), and the start time (lstart)
# Find all the rows that aren't for today
# Cut that down to just the first field (process id)
PROCS="$(ps -u tony -o pid,lstart | fgrep -v " $( date '+%a %b %d' )" | cut -d' ' -f1)"

# Run through each process and ask it to shutdown
for PROC in $PROCS
do
    kill -TERM $PROC
done

# Wait for 10 seconds to give the processes time to stop
sleep 10

# Kill off any processes that still exist
for PROC in $PROCS
do
    [ -r /proc/${PROC}/status ] && kill -KILL $PROC
done

Embora você não queira realmente fazer isso.
Todos os processos são anexados às sessões, se você puder descobrir qual era a sua sessão antiga do VNC, deverá ser capaz de eliminar os processos que pertencem a essa sessão, em vez de apenas procurar por processos "antigos".

    
por 11.02.2011 / 05:54
1
  1. Tenha muito cuidado para não matar processos daemon para o sistema.
  2. Por que você precisa matar os processos de Tony com mais de um dia de vida?
  3. Enviar SIGKILL (-9) é brutal. É melhor enviar SIGTERM (15) e SIGHUP (1) antes de enviar o SIGKILL. Os sinais SIGHUP e SIGTERM dão ao processo a chance de limpar e sair sob controle; simplesmente enviar SIGKILL significa que arquivos de bloqueio não podem ser limpos, por exemplo.

Para obter uma lista de seus processos iniciada há tempo suficiente para que o processo tenha uma data em vez de uma hora no campo de tempo, você poderia usar:

pids=$(ps -aux |
       awk '$1 ~ /^tony$/ && $9 !~ /[0-2]?[0-9]:[0-5][0-9]/ { print $2; }')
for signal in 15 1 9
do
    kill -$signal $pids 2>/dev/null
    sleep 1
done

O script awk procura linhas que começam com 'tony' mas não correspondem a uma hora na coluna 9 - elas têm uma data e são, portanto, 'antigas'. Como sugerido, a sinalização é feita em 3 etapas: terminar, desligar, matar. Com cuidado, você pode passar o nome de usuário para o script awk em vez de hardwiring o nome como tony .

    
por 11.02.2011 / 04:23
0

No linux, você pode ver todos os seus processos com pelo menos 24 horas de idade com

find /proc -name [1-9]* -maxdepth 1 -user tony -mtime +0

e tirá-los com algo como

for signal in -TERM -HUP -KILL
do
    kill $signal \
         $(find /proc -name [1-9]* -maxdepth 1 -user tony -mtime +0 | cut -d/ -f3)
    sleep 3
done

Analisar ps é certamente uma opção, mas tento evitar isso porque as opções e os formatos de saída podem variar muito para esse comando de sistema para sistema.

    
por 11.02.2011 / 17:37
0

Se você não precisa disso para criar scripts, mas apenas para uma solicitação única, também é necessário fazer o checkout htop . Etapas:

  1. Iniciar
  2. Pressione S (configuração)
  3. Desça até as colunas, escolha STARTTIME
  4. Prima < para ordenar, escolha START
  5. Selecione os processos que você quer matar com Espaço
  6. Como alternativa, use também \ (barra invertida) para filtrar pelo nome do processo.
  7. Eliminar processos com k .
por 25.02.2015 / 20:33