---
name: "at"
section: "1"
platform: "macos"
package: "system_cmds"
version: "1042.120.1"
release: "macOS 26.5"
platforms: ["linux", "freebsd", "openbsd", "macos"]
url: "https://new.carta.tech/at"
---

# at(1)

queue, examine or delete jobs for later execution

## NAME

**at**, **batch**, **atq**, **atrm** – queue, examine or delete jobs for later execution

## SYNOPSIS

**at** \[**-q** *queue*\] \[**-f** *file*\] \[**-mldbv**\] *time*

**at** \[**-q** *queue*\] \[**-f** *file*\] \[**-mldbv**\] **-t** \[\[*CC*\]*YY*\] *MM**DD**hh**mm*\[.*SS*\]

**at** **-c** *job* \[*job* *...*\]

**at** **-l** \[*job* *...*\]

**at** **-l** **-q** *queue*

**at** **-r** *job* \[*job* *...*\]

**atq** \[**-q** *queue*\] \[**-v**\]

**atrm** *job* \[*job* *...*\]

**batch** \[**-q** *queue*\] \[**-f** *file*\] \[**-mv**\] \[*time*\]

## DESCRIPTION

The **at** and **batch** utilities read commands from standard input or a specified file which are to be executed at a later time, using [sh(1)](/sh/1.md).

- **at**

  executes commands at a specified time;

- **atq**

  lists the user's pending jobs, unless the user is the superuser; in that case, everybody's jobs are listed;

- **atrm**

  deletes jobs;

- **batch**

  executes commands when system load levels permit; in other words, when the load average drops below 1.5 times number of active CPUs, or the value specified in the invocation of **atrun**.

The **at** utility allows some moderately complex *time* specifications. It accepts times of the form *HHMM* or *HH:MM* to run a job at a specific time of day. (If that time is already past, the next day is assumed.) As an alternative, the following keywords may be specified: *midnight*, *noon*, or *teatime* (4pm) and time-of-day may be suffixed with *AM*, *PM*, or *UTC* for running in the morning, the evening, or in UTC time. The day on which the job is to be run may also be specified by giving a date in the form *month-name* *day* with an optional *year*, or giving a date of the forms *DD.MM.YYYY*, *DD.MM.YY*, *MM/DD/YYYY*, *MM/DD/YY*, *MMDDYYYY*, *or* *MMDDYY*. The specification of a date must follow the specification of the time of day. Time can also be specified as: \[*now*\] *+* *count* *time-units*, where the time-units can be *minutes*, *hours*, *days*, *weeks*, *months* or *years* and **at** may be told to run the job today by suffixing the time with *today* and to run the job tomorrow by suffixing the time with *tomorrow*. The shortcut *next* can be used instead of *+* *1*.

For example, to run a job at 4pm three days from now, use **at** *4pm* *+* *3* *days*, to run a job at 10:00am on July 31, use **at** *10am* *Jul* *31* and to run a job at 1am tomorrow, use **at** *1am* *tomorrow*.

The **at** utility also supports the POSIX time format (see **-t** option).

For both **at** and **batch**, commands are read from standard input or the file specified with the **-f** option and executed. The working directory, the environment (except for the variables TERM, TERMCAP, DISPLAY and *\_*) and the *umask* are retained from the time of invocation. An **at** or **batch** command invoked from a [su(1)](/su/1.md) shell will retain the current userid. The user will be mailed standard error and standard output from his commands, if any. Mail will be sent using the command [sendmail(8)](/sendmail/8.md). If **at** is executed from a [su(1)](/su/1.md) shell, the owner of the login shell will receive the mail.

The superuser may use these commands in any case. For other users, permission to use **at** is determined by the files */usr/lib/cron/at.allow* and */usr/lib/cron/at.deny*.

If the file */usr/lib/cron/at.allow* exists, only usernames mentioned in it are allowed to use **at**. In these two files, a user is considered to be listed only if the user name has no blank or other characters before it on its line and a newline character immediately after the name, even at the end of the file. Other lines are ignored and may be used for comments.

If */usr/lib/cron/at.allow* does not exist, */usr/lib/cron/at.deny* is checked, every username not mentioned in it is then allowed to use **at**.

If neither exists, only the superuser is allowed use of **at**. This is the default configuration.

## IMPLEMENTATION NOTES

Note that **at** is implemented through the launchd(8) daemon periodically invoking [atrun(8)](/atrun/8.md), which is disabled by default. See [atrun(8)](/atrun/8.md) for information about enabling **atrun**.

## OPTIONS

- **-q** *queue*

  Use the specified queue. A queue designation consists of a single letter; valid queue designations range from *a* to *z* and *A* to *Z*. The *a* queue is the default for **at** and the *b* queue for **batch**. Queues with higher letters run with increased niceness. If a job is submitted to a queue designated with an uppercase letter, it is treated as if it had been submitted to batch at that time. If **atq** is given a specific queue, it will only show jobs pending in that queue.

- **-m**

  Send mail to the user when the job has completed even if there was no output.

- **-f** *file*

  Read the job from *file* rather than standard input.

- **-l**

  With no arguments, list all jobs for the invoking user. If one or more job numbers are given, list only those jobs.

- **-d**

  Is an alias for **atrm** (this option is deprecated; use **-r** instead).

- **-b**

  Is an alias for **batch**.

- **-v**

  For **atq**, shows completed but not yet deleted jobs in the queue; otherwise shows the time the job will be executed.

- **-c**

  Cat the jobs listed on the command line to standard output.

- **-r**

  Remove the specified jobs.

- **-t**

  Specify the job time using the  time format. The argument should be in the form \[\[*CC*\]*YY*\] *MM**DD**hh**mm*\[.*SS*\] where each pair of letters represents the following:

  - *CC*

    The first two digits of the year (the century).

  - *YY*

    The second two digits of the year.

  - *MM*

    The month of the year, from 1 to 12.

  - *DD*

    the day of the month, from 1 to 31.

  - *hh*

    The hour of the day, from 0 to 23.

  - *mm*

    The minute of the hour, from 0 to 59.

  - *SS*

    The second of the minute, from 0 to 60.

    If the *CC* and *YY* letter pairs are not specified, the values default to the current year. If the *SS* letter pair is not specified, the value defaults to 0.

## FILES

- */usr/lib/cron/jobs*

  directory containing job files

- */usr/lib/cron/spool*

  directory containing output spool files

- */var/run/utmpx*

  login records

- */usr/lib/cron/at.allow*

  allow permission control

- */usr/lib/cron/at.deny*

  deny permission control

- */usr/lib/cron/jobs/.lockfile*

  job-creation lock file

## SEE ALSO

[nice(1)](/nice/1.md), [sh(1)](/sh/1.md), [umask(2)](/umask/2.md), [compat(5)](/compat/5.md), [atrun(8)](/atrun/8.md), [cron(8)](/cron/8.md), launchd(8), [sendmail(8)](/sendmail/8.md)

## AUTHORS

At was mostly written by Thomas Koenig ⟨*ig25@rz.uni-karlsruhe.de*⟩. The time parsing routines are by David Parsons ⟨*orc@pell.chi.il.us*⟩, with minor enhancements by Joe Halpin ⟨*joe.halpin@attbi.com*⟩.

## BUGS

If the file */var/run/utmpx* is not available or corrupted, or if the user is not logged on at the time **at** is invoked, the mail is sent to the userid found in the environment variable LOGNAME. If that is undefined or empty, the current userid is assumed.

The **at** and **batch** utilities as presently implemented are not suitable when users are competing for resources. If this is the case, another batch system such as *nqs* may be more suitable.

Specifying a date past 2038 may not work on some systems.
