Как выйти (убить) команду cp

У меня такой вопрос: создаю задание, которое копирует все файлы из вашего домашнего каталога в /var/tmp в течение получаса. Вы можете создать подкаталог в /var/tmp. Появится сообщение, указывающее, что задача копирования успешно выполнена, и я пытаюсь решить это следующим образом:

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

, но я не могу найти команду, которая убивает cp?

вопрос в книге, и я пытаюсь решить его. что я понимаю, что скопируйте весь файл в home в / var / tmp, и если файл копирования достигнет 30 в течение получаса, я должен остановить его копирование

1
задан 3 December 2017 в 22:32

2 ответа

Вы могли бы написать скрипт, предполагая, что у вас есть только одна команда cp в скрипте, вы можете использовать $, который возвращает PID скрипта оболочки, поэтому ps -ef | grep $ вернет ваш скрипт, а также cp, поэтому ps -ef | grep -E "$.*cp вернет PID команды cp, а затем просто выполните kill -15 <pid>. Вот скрипт, который делает все это, НЕ ставьте «cp» в названии.

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

Этот сценарий можно запланировать с помощью at или cron.

Вы, вероятно, хотели бы сделать следующее, если вам нужно использовать at для уничтожения сценария, назовите этот myScript.sh:

#!/bin/sh

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

Второй сценарий с именем killerQueen.sh для at ] чтобы завершить процесс через 30 минут:

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

запустите следующее:

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

Этот второй пример безопаснее, потому что мы убиваем скрипт, который выполняет копию, если он все еще работает, иначе мы создаем файл с именем /tmp/message<pid_of_killerQueen> с текстом «копирование выполнено успешно».

РЕДАКТИРОВАТЬ, после прочтения man at и вашего комментария:

cp -r * /var/tmp& echo "kill -15 \$(ps -ef | grep \"$.*cp \" | grep -v grep | awk '{print $2}')" | at now + 1 second
1
ответ дан 3 December 2017 в 22:32

Во-первых, я бы предложил вам использовать команду rsync, чтобы сохранить ненужную копию неизмененных файлов. Во-вторых, вы можете поместить процесс rsync в фон с помощью команды nohup. Затем вы можете kill обработать этот процесс, используя PID задания, недавно помещенного в фоновый режим !$ (выдаваемого командой nohup) at через определенное время:

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

Ссылки:


В качестве альтернативы вы можете использовать timeout команда - как @steeldriver предложили - таким образом:

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

Где:

  • 1800 - продолжительность тайм-аута в секундах.
  • & отодвинет процесс на задний план, поэтому вы можете использовать текущую оболочку.
0
ответ дан 3 December 2017 в 22:32

Другие вопросы по тегам:

Похожие вопросы: