Como sair (matar) o comando cp

1

Eu tenho esta pergunta: criar um trabalho em que copia todos os arquivos em seu diretório home para /var/tmp dentro de meia hora. Você pode querer criar um subdiretório em /var/tmp . Uma mensagem aparecerá para indicar que a tarefa de cópia foi feita com sucesso e eu tento resolver assim:

cp * /var/tmp/ | (try to kill cp )| at now + 30 minute

mas eu sou de aço eu não encontrei o comando que mata cp?

a questão no livro e tento resolvê-lo. o que eu entendo que copiar todos os arquivos em casa para / var / tmp e se o arquivo de cópia invadir 30 dentro de meia hora, então eu deveria pará-lo copiar

    
por Zeno moon 03.12.2017 / 20:07

2 respostas

1

Você poderia escrever um script, assumindo que você só tem um comando cp no script, você poderia usar $$ que retorna o PID do script de shell, então ps -ef | grep $$ retornará seu script assim como o cp comando, então ps -ef | grep -E "$$.*cp retornará o PID do comando cp , e você simplesmente fará kill -15 <pid> . Aqui está um script que faz tudo, não coloque "cp" no nome.

#!/bin/sh


cp -r .* /var/tmp/ &

#sleep 30 minutes then kill cp
sleep 1800 && kill -15 $(ps -ef | grep -E "$$.*cp " | awk '{print $2}') || echo "copy completed as kill failed"

Este script pode ser agendado com at ou cron .

Você provavelmente gostaria de fazer o seguinte se tiver que usar at para matar o script, nomeie este myScript.sh :

#!/bin/sh

echo $$ > /tmp/myPID    
cp -r .* /var/tmp/
rm /tmp/myPID

Um segundo script chamado killerQueen.sh para at para matar o processo após 30 minutos:

#!/bin/sh

if [ -f /tmp/myPID]; then 
  kill -15 $(cat /tmp/myPID)
  echo "Copy not complete." > /tmp/message$$
else
  echo "Copy successful." > /tmp/message$$
fi

execute o seguinte:

$ myScript.sh&
Job 1
$ at -f ./killerQueen.sh now + 30 minute

Este segundo exemplo é mais seguro, porque nós matamos o script que realiza a cópia, se ainda estiver rodando, senão criamos um arquivo chamado /tmp/message<pid_of_killerQueen> com o texto "cópia bem sucedida".

EDIT, depois de ler man at e seu comentário:

cp -r * /var/tmp& echo "kill -15 \$(ps -ef | grep \"$$.*cp \" | grep -v grep | awk '{print $2}')" | at now + 1 second
    
por thecarpy 03.12.2017 / 20:23
0

Firs Sugiro que você use o comando rsync para preservar cópias desnecessárias de arquivos inalterados. Segundo, você poderia empurrar o processo rsync para o background usando o comando nohup . Então você pode kill o processo, usando o PID do trabalho colocado recentemente no segundo plano !$ (emitido pelo comando nohup ) at determinado tempo:

#!/bin/bash
nohup rsync -arqvzh --ignore-errors "$HOME"/* "/var/tmp/" > /dev/null 2>&1 &
echo "kill -9 $!" | at now +30 minutes -M > /dev/null 2>&1

Referências:

Como alternativa, você pode usar o comando timeout - como @steeldriver tem sugerido - desta forma:

timeout 1800 rsync -arqvzh --ignore-errors "$HOME"/* "/var/tmp/" &

Onde:

  • 1800 é a duração do tempo limite em segundos.
  • & irá empurrar o processo para o segundo plano, assim você pode usar o shell atual.
por pa4080 04.12.2017 / 13:59