6

I'm trying to perform a one-liner using at.

Basically, I want to send an SMS at some point in the future.

Here's my command to send an SMS:

php -r 'include_once("/home/eamorr/open/open.ie/www/newsite/ajax/constants.php");sendCentralSMS("08574930418","hi");'

The above works great! I receive my sms in a couple of seconds.

Now, how can I get at to run this command in future?

I tried

php -r 'include_once("/home/eamorr/open/open.ie/www/newsite/ajax/constants.php");sendCentralSMS("08574930418","hi");' | at now + 2 minutes

But this sends my command immediately! I want to send the message in 2 minutes' time!

0

3 Answers 3

13

Because that's not how the at command works. at takes the command in via STDIN. What you're doing above is running the script and giving its output (if there is any) to at.

This is the functional equivalent of what you're doing:

echo hey | at now + 1 minute

Since echo hey prints out just the word "hey" the word "hey" is all I'm giving at to execute one minute in the future. You probably want to echo the full php command to at instead of running it yourself. In my example:

echo "echo hey" | at now + 1 minute

EDIT:

As @Gnouc pointed out, you also had a typo in your at spec. You have to say "now" so it knows what time you're adding 1 minute to.

5
  • Hi, I'm not sure what you mean. Is there a workaround that you can think of? Thank you,
    – Eamorr
    Jul 25, 2014 at 19:13
  • updated my answer
    – Bratchley
    Jul 25, 2014 at 19:16
  • Totally confused for a moment there... But I got it to work! Yippee! (Just updating the OP now)
    – Eamorr
    Jul 25, 2014 at 19:24
  • On CentOS, I had to use at now + 1 minutes (plural minutes, not singular minute).
    – Tom Weiss
    May 30, 2019 at 18:31
  • Any way to specify time in seconds ?
    – s.k
    Jan 26, 2021 at 20:24
4

You have an error in your syntax:

php -r 'include_once("/home/eamorr/open/open.ie/www/newsite/ajax/constants.php");sendCentralSMS("08574930418","hi");' |
at now + 2 minutes

From man at:

You can also give times like now + count time-units, where the time-units 
can be minutes, hours, days, or  weeks and  you  can  tell  at to run the 
job today by suffixing the time with today and to run the job tomorrow by
suffixing the time with tomorrow.

You should wrap your php command in a shell script, then execute it.

$ cat sms.sh
#!/bin/bash

/usr/bin/php -r 'include_once("/home/eamorr/open/open.ie/www/newsite/ajax/constants.php");sendCentralSMS("08574930418","hi");'

Then:

$ at -f sms.sh now + 2 minutes
1
  • I really didn't want to have to create a load of files. This thing is going to be called a lot and I don't want file conflicts, etc.
    – Eamorr
    Jul 25, 2014 at 19:25
2

If you are just concerned with sending the message after 2 minutes irrespective of the approach, I would suggest using sleep.

( sleep 120 ;  php -r 'include_once("/home/eamorr/open/open.ie/www/newsite
/ajax/constants.php");sendCentralSMS("08574930418","hi");' )
1
  • Maybe. What happens if the server falls over? Do I lose all my notifications? Some are set to weeks/months in advance. Does at preserve scheduled tasks on restart?
    – Eamorr
    Jul 25, 2014 at 19:36

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .