You could write a script, assuming you only have one cp command in the script, you could use $$ which returns the PID of the shell script, so ps -ef | grep $$ will return your script as well as the cp command, so ps -ef | grep -E "$$.*cp will return the PID of the cp command, then you simply do kill -15 <pid>. Here is a script that does it all, do NOT put "cp" in the name.
#!/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"
This script you can schedule with at or cron.
You probably would like to do the following if you have to use at to kill the script, name this one myScript.sh:
#!/bin/sh
echo $$ > /tmp/myPID
cp -r .* /var/tmp/
rm /tmp/myPID
A second script named killerQueen.sh for at to kill the process after 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
run the following:
$ myScript.sh&
Job 1
$ at -f ./killerQueen.sh now + 30 minute
This second example is safer, because we kill the script that performs the copy, if it is still running, else we create a file named /tmp/message<pid_of_killerQueen> with the text "copy succeeded".
EDIT, after reading man at and your comment:
cp -r * /var/tmp& echo "kill -15 \$(ps -ef | grep \"$$.*cp \" | grep -v grep | awk '{print $2}')" | at now + 1 second
cp * /var/tmp/launched in your home directory will NOT recursively copy all files. Assuming, for example, that you have a "Music" directory in your home directory, no files from that directory will be copied. Then, it is not clear what you want to achieve. Do you want to copy files for 30 minutes then killcpor do you want to launchcpevery 30 minutes ? I am really trying to understand :-( – thecarpy Dec 03 '17 at 19:12