Home Switchboard Unix Administration Red Hat TCP/IP Networks Neoliberalism Toxic Managers
May the source be with you, but remember the KISS principle ;-)

at command and one time command scheduling

News Cron Books Recommended Links Reference


Time Specification Options atq command batch command      

date command

nohup command Enterprise Job schedulers Cron Tips Sysadmin Horror Stories




The idea of the at command is to facilitate "one time command scheduling". We will be taking about unix/linux command, but at command also exists in Windows (with a different syntax).

In this sense it is complementary to cron command which usually is used to schedule aperiodic jobs that need to start somewhere in the future.  It is also can be used instead of nohup command:

at -f myjob now

NOTE: Usage of screen is desirable because often you start a long job and then realize that you can't wait till its completion. In Solaris and AIX nohup permits converting already running process to "nohup status", which is extremely useful functionality that Linux sadly still lacks.


In it important to understand that at is quite different from cron: at command preserves the environment in which it was invoked, while cron does not (it executes command in its own "cron" environment, and you should not expect that PATH and other valuables are preserved from the account under which cron is running).

You can compile crontab into sequence of at commands and use at exclusively. If you consolidate all crontabs on one server and perform compilation at the end of each scheduling day distributing the results via ssh to target servers for the next day you actually will have a more flexible environment then cron, somewhat similar to expensive Enterprise Job schedulers.

Time Specification

The only argument at accepts is time specification. At allows fairly complex time specifications, extending the POSIX.2 standard. It accepts times of the form HH:MM or HHMM (four digits without column) to run a job at a specific time of day. (If that time is already past, the next day is assumed.)

 You may also use words such as midnight, noon, teatime (4pm), now. For some strange (and somewhat pervert) reason they even allow you can have a time-of-day suffixed with AM or PM for running in the morning or the evening.  I think that those who can't specify time in 24 hour format should not use Unix/Linux ;-). This is somewhat common to inability of the USA to switch from imperial measures to metric system, which is source of nasty jokes about the USA elite mental capacities for 50 years or so.

You can also say what day the job will be run, by giving a date in the form month-name day with an optional year, or giving a date of the form MMDDYY or MM/DD/YY or DD.MM.YY or, better, YYYY-MM-DD.

The specification of a date must follow the specification of the time of day.

For example, to run a job at 4pm three days from now, you would do at 4pm + 3 days, to run a job at 10:00am on July 31, you would do

at 10:00 2014-06-31   

Similarly to run a job at 1am tomorrow, you would do

at 1:00 tomorrow  

The exact definition of the time specification In YACC format can be found in /usr/share/doc/at-3.1.10/timespec.

Relative times

The most important ability of at command is the its ability to operate in relative time terms. There are several important relative time frames used:

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.

The optional increment after time specification in at command permit to specify offset from the time. It should be a number preceded by a plus sign (+) with one of the following suffixes:

The spacing is quite flexible as long as there are no ambiguities. For example:

at 0815am Jan 24
at 8 :15amjan24
at now "+ 1day"
at 5 pm FRIday
at '17 utc+30minutes'

The singular forms are also accepted, for example

at now + 1 minute

The keyword next can be used as an equivalent to an increment + 1. For example the following two commands are equivalent:

at 2pm + 1 week
at 2pm next week

The last two are equivalent commands.

One can also use at for periodic but dynamic rescheduling of jobs. In such case at can be specified inside the job with new, dynamic interval.

Simplified (and actually wrong as if interval is fixed crontab is a more appropriate vehicle for such work) example, can be something like a script named my.daily which we force to run every day by invoking at inside the script itself:

# my.daily
# runs every day
at now tomorrow < my.daily
... ... ...
For large intervals (say more then an hour) this is a better implementation then using sleep inside the script as it release resources after execution




The at command is part of the set of four commands that includes at, batch, atq, and atrm commands:

Syntax of Linux Gnu implementation is as follows:

at [-V] [-q queue] [-f file] [-mldbv] TIME

at -c job [job...]


at.allow and at.deny files

Like cron command, at command is controlled by two files that list users one per line similar to cron.allow and cron.deny :

Some sysadmin hardlink those two files to cron files to avoid synchronization problem.

You can hardlink at.allow to cron.allow and at.deny to cron.deny to avoid synchronization problems


Execute command "/sbin/chkconfig sendmail off" passed via pipe at 19:00 today

echo "/sbin/chkconfig sendmail off" | at -m 19:00

Check the queue

3       2013-06-07 19:00 a root

Check is you specified everything right

at -c 3
# atrun uid=0 gid=0
# mail     root 1
umask 22
MC_COLOR_TABLE=editnormal=black,white:editbold=white,black:editmarked=blue,cyan; export MC_COLOR_TABLE
MANPATH=/usr/man:/usr/local/man:/usr/share/man:/opt/OV/man:/opt/perf/man; export MANPATH
... ... ... 
cd /home/joeuser || {
         echo 'Execution directory inaccessible' >&2
         exit 1
/sbin/chkconfig sendmail off

Using modifier tomorrow

at -m 0730 tomorrow
sort < file >outfile

Redirecting Output

This sequence, which demonstrates redirecting standard error to a pipe, is useful in a command procedure (the sequence of output redirection specifications is significant):
$ at now + 1 hour <<!
diff file1 file2 2>&1 >outfile | mailx mygroup

This sequence can be used at a terminal:

$ batch
sort <file >outfile

This sequence, which demonstrates redirecting standard error to a pipe, is useful in a command procedure (the sequence of output redirection specifications is significant):

$ batch <<!
diff file1 file2 2>&1 >outfile | mailx mygroup

Top Visited
Past week
Past month


Old News ;-)

Linux tip Job scheduling with cron and at

IBM Developerworks

Sometimes you may need to run a job just once, rather than regularly. For this you use the at command. The commands to be run are read from a file specified with the -f option, or from stdin if -f is not used. The -m option sends mail to the user even if there is no stdout from the command. The -v option displays the time at which the job will run before reading the job. The time is also displayed in the output.

Listing 5 shows an example of running the script that you used earlier. Listing 6 shows the output that is mailed back to the user after the job runs. Notice that it is somewhat more compact than the corresponding output from the cron job.

[ian@lyrebird ~]$ at -f -v 10:25
Sat Jul  7 10:25:00 2007

job 5 at Sat Jul  7 10:25:00 2007
From  Sat Jul  7 10:25:00 2007
Date: Sat, 7 Jul 2007 10:25:00 -0400
From: Ian Shields <>
Subject: Output from your job        5

It is now 10:25:00 on Saturday

Time specifications can be quite complex. Listing 7 shows a few examples. See the man page for at or the file /usr/share/doc/at/timespec or a file such as /usr/share/doc/at-3.1.10/timespec, where 3.1.10 in this example is the version of the at package.

Listing 7. Time values with the at command
[ian@lyrebird ~]$ at -f  10pm tomorrow
job 14 at Sun Jul  8 22:00:00 2007
[ian@lyrebird ~]$ at -f 2:00 tuesday
job 15 at Tue Jul 10 02:00:00 2007
[ian@lyrebird ~]$ at -f 2:00 july 11
job 16 at Wed Jul 11 02:00:00 2007
[ian@lyrebird ~]$ at -f 2:00 next week
job 17 at Sat Jul 14 02:00:00 2007

Being nice

The nice value for a job is a measure of how nice it is to other users. See our tutorial LPI exam 101 prep: GNU and UNIX commands for information on the nice and renice commands.

The at command also has a -q option. Increasing the queue increases the nice value for the job. There is also a batch command, which is similar to the at command except that jobs are run only when the system load is low enough. See the man pages for more details on these features.

Cron jobs not running

Sun Technology Forums

Ok, I got it! The issue was within the pam.conf and we were missing the following line:

cron account required

Thanks for the help!

Solaris 9's Crontab


After some research I found out that Solaris logs crontab messages to /var/cron/log (which is actually pretty predictable logging for Solaris). The log entries for the updating of the sunfreeware mirror looked something like this:

> CMD: /usr/local/bin/update-sunfreeware
> ftp 21022 c Fri Jul 30 06:00:00 2004
! bad user (ftp) Fri Jul 30 06:00:00 2004

So we are talking about a bad user here. Well actually the user is all there and running in /etc/passwd and /etc/shadow. But hey wait, the FTP account is locked. Well I found that normal behaviour, but guess what, crontab expects a password there, else the account is not good and is a bad user!

Recommended Links

Google matched content

Softpanorama Recommended

Top articles


Solaris Reference

There are two variants of at in Solaris: System V and BSD:

System V


/usr/xpg4/bin/at [-c| -k| -s] [-m] [-f file] [-p project] [-q queuename] -t time
/usr/xpg4/bin/at [-c| -k| -s] [-m] [-f file] [-p project] [-q queuename] timespec
/usr/xpg4/bin/at -l [-p project] [-q queuename] [at_job_id...]
/usr/xpg4/bin/at -r at_job_id. ..
/usr/xpg4/bin/batch [-p project]

Two "twins" at and batch are very similar with batch being alias to at with supplied "now" time of execution.

Commands of the forms:

/usr/bin/batch [-p project]
/usr/xpg4/bin/batch [-p project]

are respectively equivalent to:

/usr/bin/at -q b [-p project] now
/usr/xpg4/bin/at -q b -m [-p project] now

At the same time at is quite different animal than cron: "at" preserves the environment in which it was invoked, while cron does not (it executes command in its own "cron" environment, and you should not expect that PATH and other valuables will be preserved).

The at utility is pipable: it can reads commands from standard input and submit a job to be executed immediately (like in example below) or at a later time.

echo "perl myjob" | at now

The at-job is executed in a separate invocation of the shell, running in a separate process group with no controlling terminal, except that the environment variables, current working directory, file creation mask (see umask(1)), and system resource limits (for sh and ksh only, see ulimit(1)) in effect when the at utility is executed is retained and used when the at-job is executed.

When the at-job is submitted, the at_job_id and scheduled time are written to standard error. The at_job_id is an identifier that is a string consisting solely of alphanumeric characters and the period character. The at_job_id is assigned by the system when the job is scheduled such that it uniquely identifies a particular job.

User notification and the processing of the job's standard output and standard error are described under the -m option.


Like with cron two files that list users one per line and are similar to cron control files control the behavior of the command:



The batch utility reads commands to be executed one after another and is equivalent to at now. The difference is that the queue used is a special at queue, that exists specifically for batch jobs. Execution of submitted jobs can be delayed by limits on the number of jobs allowed to run concurrently. See queuedefs(4).

Solaris Options

If the -c, -k, or -s options are not specified, the SHELL environment variable by default determines which shell to use.

For /usr/xpg4/bin/at and /usr/xpg4/bin/batch, if SHELL is unset or NULL, /usr/xpg4/bin/sh is used.

For usr/bin/at and /usr/bin/batch, if SHELL is unset or NULL, /bin/sh is used.

The following options are supported:

C shell. csh(1) is used to execute the at-job.
Korn shell. ksh(1) is used to execute the at-job.
Bourne shell. sh(1) is used to execute the at-job.
-f file
Specifies the path of a file to be used as the source of the at-job, instead of standard input.
(The letter ell.) Reports all jobs scheduled for the invoking user if no at_job_id operands are specified. If at_job_ids are specified, reports only information for these jobs.
Sends mail to the invoking user after the at-job has run, announcing its completion. Standard output and standard error produced by the at-job are mailed to the user as well, unless redirected elsewhere. Mail is sent even if the job produces no output.

If -m is not used, the job's standard output and standard error is provided to the user by means of mail, unless they are redirected elsewhere; if there is no such output to provide, the user is not notified of the job's completion.

-p project
Specifies under which project the at or batch job is run. When used with the -l option, limits the search to that particular project. Values for project is interpreted first as a project name, and then as a possible project ID, if entirely numeric. By default, the user's current project is used.
-q queuename
Specifies in which queue to schedule a job for submission. When used with the -l option, limits the search to that particular queue. Values for queuename are limited to the lower case letters a through z. By default, at-jobs are scheduled in queue a. In contrast, queue b is reserved for batch jobs. Since queue c is reserved for cron jobs, it can not be used with the -q option.
-r at_job_id
Removes the jobs with the specified at_job_id operands that were previously scheduled by the at utility.
-t time
Submits the job to be run at the time specified by the time option-argument, which must have the format as specified by the touch(1) utility.

Solaris Operands

The following operands are supported:

The name reported by a previous invocation of the at utility at the time the job was scheduled.
Submit the job to be run at the date and time specified. All of the timespec operands are interpreted as if they were separated by space characters and concatenated. The date and time are interpreted as being in the timezone of the user (as determined by the TZ variable), unless a timezone name appears as part of time below.

In the "C" locale, the following describes the three parts of the time specification string. All of the values from the LC_TIME categories in the "C" locale are recognized in a case-insensitive manner.

The time can be specified as one, two or four digits. One- and two-digit numbers are taken to be hours, four-digit numbers to be hours and minutes. The time can alternatively be specified as two numbers separated by a colon, meaning hour:minute. An AM/PM indication (one of the values from the am_pm keywords in the LC_TIME locale category) can follow the time; otherwise, a 24-hour clock time is understood. A timezone name of GMT, UCT, or ZULU (case insensitive) can follow to specify that the time is in Coordinated Universal Time. Other timezones can be specified using the TZ environment variable. The time field can also be one of the following tokens in the "C" locale:
Indicates the time 12:00 am (00:00).
Indicates the time 12:00 pm.
Indicate the current day and time. Invoking at now submits an at-job for potentially immediate execution (that is, subject only to unspecified scheduling delays).

An optional date can be specified as either a month name (one of the values from the mon or abmon keywords in the LC_TIME locale category) followed by a day number (and possibly year number preceded by a comma) or a day of the week (one of the values from the day or abday keywords in the LC_TIME locale category). Two special days are recognized in the "C" locale:
Indicates the current day.
Indicates the day following the current day.

If no date is given, today is assumed if the given time is greater than the current time, and tomorrow is assumed if it is less. If the given month is less than the current month (and no year is given), next year is assumed.

The optional increment is a number preceded by a plus sign (+) and suffixed by one of the following: minutes, hours, days, weeks, months, or years. (The singular forms are also accepted.) The keyword next is equivalent to an increment number of + 1. For example, the following are equivalent commands:
at 2pm + 1 week
			at 2pm next week


The format of the at command line shown here is guaranteed only for the "C" locale. Other locales are not supported for midnight, noon, now, mon, abmon, day, abday, today, tomorrow, minutes, hours, days, weeks, months, years, and next.

Since the commands run in a separate shell invocation, running in a separate process group with no controlling terminal, open file descriptors, traps and priority inherited from the invoking environment are lost.


FAIR USE NOTICE This site contains copyrighted material the use of which has not always been specifically authorized by the copyright owner. We are making such material available in our efforts to advance understanding of environmental, political, human rights, economic, democracy, scientific, and social justice issues, etc. We believe this constitutes a 'fair use' of any such copyrighted material as provided for in section 107 of the US Copyright Law. In accordance with Title 17 U.S.C. Section 107, the material on this site is distributed without profit exclusivly for research and educational purposes.   If you wish to use copyrighted material from this site for purposes of your own that go beyond 'fair use', you must obtain permission from the copyright owner. 

ABUSE: IPs or network segments from which we detect a stream of probes might be blocked for no less then 90 days. Multiple types of probes increase this period.  


Groupthink : Two Party System as Polyarchy : Corruption of Regulators : Bureaucracies : Understanding Micromanagers and Control Freaks : Toxic Managers :   Harvard Mafia : Diplomatic Communication : Surviving a Bad Performance Review : Insufficient Retirement Funds as Immanent Problem of Neoliberal Regime : PseudoScience : Who Rules America : Neoliberalism  : The Iron Law of Oligarchy : Libertarian Philosophy


War and Peace : Skeptical Finance : John Kenneth Galbraith :Talleyrand : Oscar Wilde : Otto Von Bismarck : Keynes : George Carlin : Skeptics : Propaganda  : SE quotes : Language Design and Programming Quotes : Random IT-related quotesSomerset Maugham : Marcus Aurelius : Kurt Vonnegut : Eric Hoffer : Winston Churchill : Napoleon Bonaparte : Ambrose BierceBernard Shaw : Mark Twain Quotes


Vol 25, No.12 (December, 2013) Rational Fools vs. Efficient Crooks The efficient markets hypothesis : Political Skeptic Bulletin, 2013 : Unemployment Bulletin, 2010 :  Vol 23, No.10 (October, 2011) An observation about corporate security departments : Slightly Skeptical Euromaydan Chronicles, June 2014 : Greenspan legacy bulletin, 2008 : Vol 25, No.10 (October, 2013) Cryptolocker Trojan (Win32/Crilock.A) : Vol 25, No.08 (August, 2013) Cloud providers as intelligence collection hubs : Financial Humor Bulletin, 2010 : Inequality Bulletin, 2009 : Financial Humor Bulletin, 2008 : Copyleft Problems Bulletin, 2004 : Financial Humor Bulletin, 2011 : Energy Bulletin, 2010 : Malware Protection Bulletin, 2010 : Vol 26, No.1 (January, 2013) Object-Oriented Cult : Political Skeptic Bulletin, 2011 : Vol 23, No.11 (November, 2011) Softpanorama classification of sysadmin horror stories : Vol 25, No.05 (May, 2013) Corporate bullshit as a communication method  : Vol 25, No.06 (June, 2013) A Note on the Relationship of Brooks Law and Conway Law


Fifty glorious years (1950-2000): the triumph of the US computer engineering : Donald Knuth : TAoCP and its Influence of Computer Science : Richard Stallman : Linus Torvalds  : Larry Wall  : John K. Ousterhout : CTSS : Multix OS Unix History : Unix shell history : VI editor : History of pipes concept : Solaris : MS DOSProgramming Languages History : PL/1 : Simula 67 : C : History of GCC developmentScripting Languages : Perl history   : OS History : Mail : DNS : SSH : CPU Instruction Sets : SPARC systems 1987-2006 : Norton Commander : Norton Utilities : Norton Ghost : Frontpage history : Malware Defense History : GNU Screen : OSS early history

Classic books:

The Peter Principle : Parkinson Law : 1984 : The Mythical Man-MonthHow to Solve It by George Polya : The Art of Computer Programming : The Elements of Programming Style : The Unix Hater’s Handbook : The Jargon file : The True Believer : Programming Pearls : The Good Soldier Svejk : The Power Elite

Most popular humor pages:

Manifest of the Softpanorama IT Slacker Society : Ten Commandments of the IT Slackers Society : Computer Humor Collection : BSD Logo Story : The Cuckoo's Egg : IT Slang : C++ Humor : ARE YOU A BBS ADDICT? : The Perl Purity Test : Object oriented programmers of all nations : Financial Humor : Financial Humor Bulletin, 2008 : Financial Humor Bulletin, 2010 : The Most Comprehensive Collection of Editor-related Humor : Programming Language Humor : Goldman Sachs related humor : Greenspan humor : C Humor : Scripting Humor : Real Programmers Humor : Web Humor : GPL-related Humor : OFM Humor : Politically Incorrect Humor : IDS Humor : "Linux Sucks" Humor : Russian Musical Humor : Best Russian Programmer Humor : Microsoft plans to buy Catholic Church : Richard Stallman Related Humor : Admin Humor : Perl-related Humor : Linus Torvalds Related humor : PseudoScience Related Humor : Networking Humor : Shell Humor : Financial Humor Bulletin, 2011 : Financial Humor Bulletin, 2012 : Financial Humor Bulletin, 2013 : Java Humor : Software Engineering Humor : Sun Solaris Related Humor : Education Humor : IBM Humor : Assembler-related Humor : VIM Humor : Computer Viruses Humor : Bright tomorrow is rescheduled to a day after tomorrow : Classic Computer Humor

The Last but not Least

Copyright © 1996-2016 by Dr. Nikolai Bezroukov. was created as a service to the UN Sustainable Development Networking Programme (SDNP) in the author free time. This document is an industrial compilation designed and created exclusively for educational use and is distributed under the Softpanorama Content License.

The site uses AdSense so you need to be aware of Google privacy policy. You you do not want to be tracked by Google please disable Javascript for this site. This site is perfectly usable without Javascript.

Original materials copyright belong to respective owners. Quotes are made for educational purposes only in compliance with the fair use doctrine.

FAIR USE NOTICE This site contains copyrighted material the use of which has not always been specifically authorized by the copyright owner. We are making such material available to advance understanding of computer science, IT technology, economic, scientific, and social issues. We believe this constitutes a 'fair use' of any such copyrighted material as provided by section 107 of the US Copyright Law according to which such material can be distributed without profit exclusively for research and educational purposes.

This is a Spartan WHYFF (We Help You For Free) site written by people for whom English is not a native language. Grammar and spelling errors should be expected. The site contain some broken links as it develops like a living tree...

You can use PayPal to make a contribution, supporting development of this site and speed up access. In case is down you can use the at


The statements, views and opinions presented on this web page are those of the author (or referenced source) and are not endorsed by, nor do they necessarily reflect, the opinions of the author present and former employers, SDNP or any other organization the author may be associated with. We do not warrant the correctness of the information provided or its fitness for any purpose.

Last modified: April 04, 2018