---
name: "at"
section: "1"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
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** or **PM** for running in the morning or the evening. 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 **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 */var/at/at.allow* and */var/at/at.deny*.

If the file */var/at/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 */var/at/at.allow* does not exist, */var/at/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 [cron(8)](/cron/8.md) daemon by calling [atrun(8)](/atrun/8.md) every five minutes. This implies that the granularity of **at** might not be optimal for every deployment. If a finer granularity is desired, the */etc/cron.d/at* file can be edited and will be read by the system crontab, from which the  SHELL and  PATH environment variables are inherited.

## 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 *c* queue is the default for **at** and the *E* 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

- */var/at/jobs*

  directory containing job files

- */var/at/spool*

  directory containing output spool files

- */var/run/utx.active*

  login records

- */var/at/at.allow*

  allow permission control

- */var/at/at.deny*

  deny permission control

- */var/at/jobs/.lockfile*

  job-creation lock file

## EXAMPLES

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
```

To run a job at 1am tomorrow, use:

```
at 1am tomorrow
```

## SEE ALSO

[nice(1)](/nice/1.md), [sh(1)](/sh/1.md), [umask(2)](/umask/2.md), [atrun(8)](/atrun/8.md), [cron(8)](/cron/8.md), [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/utx.active* 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.
