web-dev-qa-db-fra.com

Comment sortir (tuer) la commande cp

J'ai cette question: créer un travail qui copie tous les fichiers de votre répertoire personnel dans /var/tmp dans une demi-heure. Vous souhaiterez peut-être créer un sous-répertoire dans /var/tmp. Un message apparaît pour indiquer que la tâche de copie a été effectuée avec succès et j'essaie de le résoudre comme ceci:

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

mais je suis en acier je n'ai pas trouvé de commande qui tue cp?

la question dans le livre et j'essaie de le résoudre. ce que je comprends qui copie tous les fichiers de la maison dans/var/tmp et si le fichier de copie empiète sur 30 en une demi-heure, alors je devrais arrêter de le copier

1
Zeno moon

Vous pouvez écrire un script en supposant que vous n'avez qu'une seule commande cp, vous pouvez utiliser $$ qui renvoie le PID du script Shell, de sorte que ps -ef | grep $$ renvoie également votre script. comme la commande cp, donc ps -ef | grep -E "$$.*cp renverra le PID de la commande cp, il vous suffira alors de faire kill -15 <pid>. Voici un script qui fait tout, ne mettez pas "cp" dans le nom.

#!/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"

Ce script, vous pouvez planifier avec at ou cron.

Si vous devez utiliser at pour tuer le script, nommez celui-ci myScript.sh:

#!/bin/sh

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

Un second script nommé killerQueen.sh pour at supprime le processus après 30 minutes:

#!/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

lancez ce qui suit:

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

Ce deuxième exemple est plus sûr, car nous éliminons le script qui effectue la copie. S'il est toujours en cours d'exécution, nous créons un fichier nommé /tmp/message<pid_of_killerQueen> avec le texte "copie réussie".

EDIT, après avoir lu man at et votre commentaire:

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

Premièrement, je vous suggérerais d’utiliser la commande rsync pour préserver les copies inutiles des fichiers non modifiés. Deuxièmement, vous pourriez pousser le processus rsync dans le fond en utilisant la commande Nohup. Ensuite, vous pouvez kill le processus, en utilisant le PID du travail le plus récemment placé en arrière-plan !$ (émis par la commande Nohup) at heure certaine:

#!/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

Références:


Vous pouvez également utiliser la commande timeout - comme @ steeldriver ont suggéré - de cette façon:

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

Où:

  • 1800 correspond à la durée du délai en secondes.
  • & va pousser le processus en arrière-plan, vous pouvez donc utiliser le shell actuel.
0
pa4080