Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I'm trying to schedule download at nights. I have created a atd job which starts download script at 2 AM. Now I want to stop the same job at 7 AM if it is still running. What I'm doing now is just shutdown -h 7:00. Is it possible to stop atd job at specified time?

share|improve this question
    
Stop as in kill them or pause them to be resumed later? –  slm Oct 10 '13 at 20:03
    
@slm Does it make difference? I thought using "wget -c" will make both options look same. –  Majid Azimi Oct 10 '13 at 20:06
1  
Why not just have at run killall wget at the specified time? –  terdon Oct 10 '13 at 20:11
    
Didn't know what exactly you were doing until you mentioned wget, so it's hard for us to say. Perhaps you could expand your Q so we know exactly what you're trying to do. Incidentally it can make a difference b/c we could just have the process go to sleep at 7AM vs. killing it and then resume later on in the day (would be one approach). –  slm Oct 10 '13 at 20:15
add comment

3 Answers 3

up vote 2 down vote accepted

I don't see a mechanism within at to allow you to specify a stop time. I would just schedule another at job at 7am that would check if any of these at jobs are still running and kill them.

share|improve this answer
add comment

At jobs are executed using a shell interpreter (on Linux, it is usually /bin/sh). It means that any command you are going to run as at job can be tracked by a PID number of the shell which is going to run that command. You can simply catch this PID with special shell variable $$. You can save it to a file (single quotes are mandatory to not expand it in your current session shell):

at 'echo $$ > /var/run/my_at_job.pid; your_command; rm /var/run/my_at_jon.pid' | at TIME_SPEC

and later, in another at job, you can kill the job and all its spawned child processes (you_command):

if [ -r /var/run/at_job.pid ]; then
  for PID in $(ps --ppid `cat /var/run/at_job.pid` -o pid | sed -e '1d'); do
    kill $PID
  done
fi
share|improve this answer
add comment

You could incorporate the timeout into your job.

timeout "$(($(date +%s -d '7am') - $(date +%s)))" wget -c http://example.com/wibble

Alternatively, have your job write its process ID somewhere so that you can kill it. In the 2am job:

echo $$ >~/.at.download.pid
wget -c http://example.com/wibble
rm ~/.at.download.pid

In the 7am job:

if [ -e ~/.at.download.pid ]; then
  kill $(~/.at.download.pid)
  rm ~/.at.download.pid
fi
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.