У меня такой вопрос: создаю задание, которое копирует все файлы из вашего домашнего каталога в /var/tmp
в течение получаса. Вы можете создать подкаталог в /var/tmp
. Появится сообщение, указывающее, что задача копирования успешно выполнена, и я пытаюсь решить это следующим образом:
cp * /var/tmp/ | (try to kill cp )| at now + 30 minute
, но я не могу найти команду, которая убивает cp?
вопрос в книге, и я пытаюсь решить его. что я понимаю, что скопируйте весь файл в home в / var / tmp, и если файл копирования достигнет 30 в течение получаса, я должен остановить его копирование
Вы могли бы написать скрипт, предполагая, что у вас есть только одна команда 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
Во-первых, я бы предложил вам использовать команду 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
Ссылки:
"kill" PID > " на самом деле не убивает процесс, почему? | Как убить процессы в Ubuntu?
Как запустить nohup и записать его файл pid в одном выражении bash?
Как разрешить команду 'cp' не выдает ошибку, если исходный файл не существует?
GNU - Bash Справочное руководство: Параметры оболочки: Специальные параметры
В качестве альтернативы вы можете использовать timeout
команда - как @steeldriver предложили - таким образом:
timeout 1800 rsync -arqvzh --ignore-errors "$HOME"/* "/var/tmp/" &
Где:
&
отодвинет процесс на задний план, поэтому вы можете использовать текущую оболочку.