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