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
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
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:
"kill <PID>" ne tue pas vraiment le processus, pourquoi? | Comment puis-je tuer les processus dans Ubuntu?
Comment exécuter Nohup et écrire son fichier pid dans une seule instruction bash?
Comment laisser la commande 'cp' ne déclencher une erreur quand le fichier source n'existe pas?
Manuel de référence GNU - Bash: Paramètres de shell: Paramètres spéciaux
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ù:
&
va pousser le processus en arrière-plan, vous pouvez donc utiliser le shell actuel.