Como eu mato 'repo sync' usando crontab dado que ele gera muitos processos?

1

Eu preciso "repoir sincronizar" a fonte do Android durante a noite, já que minha largura de banda mensal é limitada.

, inicio o 'repo sync' à meia-noite e, em seguida, quero matá-lo às 8h. O seguinte é o comando:

2 0 * * * /home/user/android-src/reposync.sh

reposync.sh contém:

cd /home/user/android-src
/home/user/bin/repo sync

Eu esperava matá-lo com as seguintes entradas do cron:

55 7 * * * ps -eo pid,args | grep repo | awk '{print $1}' | xargs -I {} kill {}
0 8 * * * ps -eo pid,args | grep repo | awk '{print $1}' | xargs -I {} kill -9 {}

O problema é que 'repo sync' gera muitos processos - muitos 'git', 'curl', 'git-remote-http', 'python', (e eu acho que um 'bash' e um 'sh' , como eu coloquei o comando repo sync em um script .sh). (Desculpas por minha ignorância / terminologia.)

Como posso encontrar os processos para matá-los? Ou há uma maneira melhor? O repo será executado como um usuário normal e eu posso simplesmente matar todas as tarefas desse usuário? Eu gostaria de deixar o meu computador ligado por alguns dias e fazer com que ele conecte todas as noites e desconecte todas as manhãs, apesar de todas as soluções consideradas agradáveis, incluindo o feio, por exemplo, se eu matar a conexão com a Internet? retomar isso? Não há mais nada em execução no servidor, (VirtualBox no Win7 x64 executando o Ubuntu 10.04), então eu deveria apenas reiniciar a cada oito horas?

    
por Chris 31.05.2013 / 14:23

2 respostas

1

Use um argumento negativo para kill para matar todo o grupo de processos.

#!/bin/sh
ps -eo pid,args |
awk '/[r]epo/{print $1}' |
xargs -I {} kill "$@" -{}

Observe também o antigo FAQ sobre como evitar o inútil grep | grep -v grep | awk .

Invoque isso como

55 7 * * * /path/to/killsync
0 8 * * * /path/to/killsync -9

Esperamos que o segundo nunca seja realmente necessário; Esperemos que seja inútil também.

Veja link

    
por 31.05.2013 / 17:31
0

O processo que você precisa matar gerou processos filhos que também precisam ser eliminados:

vi killemall.sh
---------------
#!/bin/bash
# 
# Get the process PID
# Kill all the processes that have a parent pid = PID
# Kill the master process
#
MASTERPID='ps -eo pid,args | grep repo | awk '{print $1}''
ps -ef | grep ${MASTERPID} | awk '{print $1}'' | while read PIDX; do kill -9 ${PIDX} 2>/dev/null; done;

O repo será executado como um usuário normal e eu posso simplesmente matar todas as tarefas desse usuário?

# Should work, but it's a complete overkill

devo eliminar a conexão com a internet para que o tempo de recompra seja esgotado e depois reiniciado? então eu deveria apenas reiniciar a cada oito horas?

# No need to come up with "excentric" solutions. Follow the Kill-Em-ALL approach, and that should solve your issue.
    
por 31.05.2013 / 15:53