In Linux, when we want to make our computer perform tasks automatically, we use something called scheduling. It's like telling the computer, "Do this thing at this time." This makes our work easier because we don't have to remember to do those tasks ourselves. One way to do this is by using the Linux at command. The at
command can serve as an alternative to the cron command when you have tasks that need to run only once at a specific time in the future.x
The "at
" command lets us schedule tasks to happen at specific times. So, if we want the computer to do something like creating a backup or sending an email, we can use the "at
" command to tell it when to do it. It's like setting an alarm for your computer to do things for you.
In this guide, we'll dive into the Linux at command and see how it helps us schedule tasks effortlessly. We'll explore 11 at
command examples for scheduling tasks in Linux. Whether you're new to Linux or already familiar, learning about the "at
" command can make your life simpler by automating tasks on your computer.
Table of Contents
What is Linux at Command?
The at command in Linux is used to schedule a one-time task to be executed at a specific time in the future. It allows you to specify a particular time when the command or script should run.
The at
command can be useful for automating one-time tasks, such as backing up files, running scripts, or sending emails.
cron Vs at
When you're in the process of scheduling tasks, you might encounter the terms "cron" and "at" and find yourself questioning the distinctions between the cron
and at
commands in the Linux environment.
The at
command and the cron
command are both used for scheduling tasks in Linux, but they have distinct differences in terms of how they work and when they are best suited to use.
The cron
utility enables you to schedule recurring tasks at specific intervals, while the at
command enables you to specify one-time actions to be performed at a desired time. For instance, you could utilize crontab
to schedule a daily backup at 2 a.m., ensuring repetitive execution. Conversely, you could use the at
command to create a reminder for a later appointment within the day, focusing on a single occurrence.
In essence, we usually use the at
command for one-time tasks scheduled at specific moments, and use the cron
command for automated, recurring tasks that need to be executed on a regular basis.
The choice between them depends on the nature of your tasks and how often you want them to run.
Install at Command in Linux
The at
command is usually pre-installed on many Linux distributions. However, if it's not available on your system, you can install it using package managers specific to your distribution. Here are the installation steps for some common Linux distributions:
Alpine Linux:
To install at command in Alpine Linux, run:
$ sudo apk add at
Arch Linux / Endeavour OS / Manjaro Linux:
Open a terminal and run the following command:
$ sudo pacman -S at
Debian / Ubuntu / Linux Mint / Pop!_OS:
Run the following commands to install 'at' in Debian-based systems:
$ sudo apt update $ sudo apt install at
RHEL / CentOS Stream / Fedora / AlmaLinux / Rocky Linux:
Open a terminal and run the following command:
$ sudo dnf install at
In older RHEL systems, use yum
instead of dnf
.
$ sudo yum install at
After the installation is complete, you can start using the at
command to schedule tasks at specific times.
Start 'at' Service
The atd
service should start automatically after installation. If it's not running, you can start and enable it with the following commands:
$ sudo systemctl start atd
$ sudo systemctl enable atd
Linux at Command Examples
The Linux at command is easy to use. You simply specify the time you want the task to run, and the command you want to run. The at
command will then create a job file and store it in the /var/spool/cron/atjobs/
directory. When the specified time arrives, the at
command will execute the job file.
Here are some examples of using the at
command to schedule one-time tasks in Linux.
1. Scheduling Jobs Interactively using 'at' Command
The at
command enables you to schedule jobs interactively by using the following syntax:
at [runtime]
When you run this command, it opens an interactive prompt where you can input the commands that you want to execute at the specified time. Additionally, the command displays a warning indicating the shell (E.g. /bin/sh
) that will be used for the scheduled job.
To save the scheduled job and exit the interactive prompt, press Ctrl + D
. If you wish to cancel the job before saving it, you can use Ctrl + C
.
Take a look at the following example.
$ at 2:37 PM echo "Hello, Welcome to OSTechNix!" > /tmp/greeting.txt <Ctrl+D>
This example will schedule the echo
command to run at 2:37 PM. The output "Hello, Welcome to OSTechNix!" will be written to the file /tmp/greeting.txt
at the specified time.
After scheduling the job, wait for the specified time to elapse. Once the scheduled time is reached, you can verify whether the message has been saved in the greeting.txt
file located in the /tmp
directory.
$ sudo cat /tmp/greeting.txt
[sudo] password for ostechnix:
Hello, Welcome to OSTechNix!
Yes, the Job is successfully executed at the specified time.
In this example, we scheduled the echo "Hello, Welcome to OSTechNix!" > /tmp/greeting.txt
command to run at a specific time using the at
command. After the scheduled time has passed, we checked the content of the greeting.txt
file to verify that the script executed successfully and saved the message as expected.
2. List Scheduled Jobs
You can list all the scheduled jobs in the 'at
' queue using command:
$ atq
Sample Output:
4 Wed Aug 8 14:37:00 2023 a ostechnix
The atq
command lists the scheduled jobs in the 'at' queue. The displayed information includes the job number, date, time, year, and queue status for the current user's pending tasks. In this case, job number 4 is scheduled to run at 14:37 PM on August 8, 2023 for the user ostechnix
.
To view the pending jobs for all users, execute the command with administrative privileges:
$ sudo atq
The above command retrieves the list of pending at
jobs, and when executed with sudo
, it provides an overview of pending jobs for all users on the system.
You can also use -l
flag with 'at
' command to view the scheduled jobs.
$ at -l
The at -l
is just an alias to atq
command.
3. Previewing Scheduled Jobs
Using the -c
option, you can preview the contents of a job that was previously scheduled using the at
command. This option comes handy when you need to know about the job's details or if you want to check its scheduled time.
To view the contents of a scheduled at
job, run the following command
$ at -c [job_number]
Example:
$ at -c 7
Sample Output:
#!/bin/sh # atrun uid=1000 gid=1000 # mail ostechnix 0 umask 22 LANGUAGE=en_IN:en; export LANGUAGE PWD=/home/ostechnix; export PWD LOGNAME=ostechnix; export LOGNAME XDG_SESSION_TYPE=tty; export XDG_SESSION_TYPE [...]
To identify the specific job number, you should run the atq
command initially. This will provide a list of all pending jobs along with their associated job numbers.
4. Pipe a Job to 'at' Command
You can schedule a job without using the interactive at
prompt by sending the commands to at through a UNIX pipe. This involves using commands like echo
or printf
to pass instructions to the at
command while also specifying the desired runtime.
For instance, to schedule an at
job that takes the output of the echo
command and writes it to a file, you can use:
$ echo "Welcome to the tutorial on Linux 'at' Command" >> Linux_at_command.txt | at now
This job will immediately run.
Sample Output:
warning: commands will be executed using /bin/sh
job 6 at Wed Aug 9 12:50:00 2023
After scheduling the job, you can verify its execution by checking the existence of the file using the cat
command:
$ cat Linux_at_command.txt Welcome to the tutorial on Linux 'at' Command
In this manner, you can efficiently schedule tasks using the at
command without needing to interactively input each command separately.
5. Scheduling Scripts
Not just commands, we can also schedule a script to run at a specific time using the at
command like below.
at 2:00 AM tomorrow /path/to/my_script.sh <Ctrl+D>
This example will schedule the execution of my_script.sh
at 2:00 AM on the next day. Please replace the path of the script with your own.
Let us see a practical example, so you can understand it clearly.
1. Create a script called testscript.sh
:
$ cat << EOF > testscript.sh > echo "Hello, Welcome to OSTechNix!" > /tmp/greeting.txt > EOF
This command uses a heredoc (<<
) to create a script called testscript.sh
with the content that follows until EOF
. The script simply echoes the text "Hello, Welcome to OSTechNix!" into a file named /tmp/greeting.txt
.
2. Make the script executable:
$ sudo chmod +x testscript.sh
This command gives the script testscript.sh
the execute permission using chmod
. Now the script can be executed as a standalone program.
3. Check the current date and time:
$ date
Sample Output:
Wednesday 09 August 2023 12:16:04 PM IST
As you can see, the exact time at the time of running this command is 12:16:04 PM.
4. Let us now schedule the script testscript.sh
to run at a later time (E.g. 12:18 PM) using the at
command:
$ at 12:18 PM -f ./testscript.sh
Sample Output:
warning: commands will be executed using /bin/sh job 5 at Wed Aug 9 12:18:00 2023
This command schedules the execution of the testscript.sh
script at 12:18 PM on August 11, 2023. The warning message indicates that the commands will be executed using the /bin/sh
shell.
5. Check the scheduled jobs in the at queue:
$ atq
Sample Output:
5 Wed Aug 9 12:18:00 2023 a ostechnix
The atq
command lists the scheduled jobs in the at queue. In this case, job number 5 is scheduled to run at 12:18 PM on August 9, 2023.
6. Now wait for the specified time to elapse. Once the scheduled time is reached, check again the 'at
' queue:
$ atq
The atq
command output should now be empty because the scheduled job has already been executed.
7. Check the contents of /tmp/greeting.txt
after the script has run:
$ cat /tmp/greeting.txt
Sample Output:
Hello, Welcome to OSTechNix!
As you see in the above output, the cat
command displays the contents of the file /tmp/greeting.txt
, which was created by the script testscript.sh
.
6. Scheduling Jobs using a Specific Date and Time Format
If you want to schedule a command using a specific date and time format, do:
$ at 01:47PM 2023-08-09 warning: commands will be executed using /bin/sh at Wed Aug 9 13:47:00 2023 at> echo "This is a scheduled task using a specific date and time format." > /tmp/date.txt at> <EOT> job 11 at Wed Aug 9 13:47:00 2023
In this case, the at
command is telling the system to schedule a job to run at 01:47 PM on August 9th, 2023.
You can read more about 'Time Expressions' later in this guide.
7. Send Email Notification on Job Completion
To send email notifications upon job completion using the at
command, you can follow these steps:
1. Ensure that your system has a working email configuration, and your user account is associated with a valid email address.
2. To instruct at
to send email notifications upon job completion, even if there is no output, you need to specify the -m
option when scheduling the job.
For example, to run a script named testscript.sh
and receive an email notification upon completion:
$ cat testscript.sh | at -m now + 1 hour
In this case, testscript.sh
is piped to the at
command, and the -m
option is used to ensure an email notification is sent when the job completes.
3. Once the job completes, you should receive an email notification at the configured email address associated with your user account. The email will contain information about the job execution.
Keep in mind that the effectiveness of this approach depends on your system's email configuration. If you encounter issues, ensure that your system is set up to send emails and that your user's email address is correctly configured.
8. Schedule Jobs without Email Notification
To prevent receiving email notifications upon job completion, you can utilize the -M
option while scheduling an at
job.
For instance:
$ echo "testscript.sh" | at -M 02:00
By including the -M
option in the at
command, you ensure that job execution occurs without generating email notifications upon completion.
This is particularly useful when you want to execute tasks silently without being alerted by email notifications.
9. Remove Scheduled Jobs
To remove a scheduled job using the at
command, you can use either the atrm
command or use -r
option with at
command followed by the job ID. Here are the steps for both methods:
9.1. Using atrm
command
Identify the job ID of the scheduled job by running the atq
command or using the -l
option with the at
command.
Run the following command to remove the job with the specified job ID:
$ atrm [job_id]
Replace [job_id]
with the actual job ID you want to remove.
Example:
1. First, list all scheduled jobs using atq
command:
$ atq
Sample Output:
7 Sun Mar 14 13:31:00 2230 a ostechnix 9 Fri Aug 9 13:40:00 3241 a ostechnix 8 Sun Mar 14 13:33:00 2230 a ostechnix 10 Wed Aug 9 13:42:00 3245 a ostechnix
As you can see, there are 4 pending jobs exists.
2. To delete a job, for example the job with the ID 7, run:
$ atrm 7
3. verify if the job is deleted by listing the scheduled jobs :
$ atq 9 Fri Aug 9 13:40:00 3241 a ostechnix 8 Sun Mar 14 13:33:00 2230 a ostechnix 10 Wed Aug 9 13:42:00 3245 a ostechnix
See? The the 7th job is gone.
9.2 Using at -r
Option
Identify the job ID of the scheduled job by running the atq
command or using the -l
option with the at
command.
Run the following command to remove the job with the specified job ID:
$ at -r [job_id]
Replace [job_id]
with the actual job ID you want to remove.
Remember that you need appropriate privileges (usually root or sudo access) to remove jobs scheduled by other users. If you're the owner of the job, you can typically remove it without additional permissions.
10. Allow or Deny Users
The /etc/at.allow
and /etc/at.deny
files are used to control user access to the at
and batch
commands, which allow users to schedule tasks for later execution. These files determine which users are allowed to submit commands for later execution using the at
and batch
commands.
Both files have a list of usernames, with each username listed on a separate line. Whitespace is not allowed.
If /etc/at.allow
exists, only usernames mentioned in this file are granted permission to use the at
command. If /etc/at.allow
is empty or doesn't exist, access control is determined by the /etc/at.deny
file.
If /etc/at.allow
doesn't exist or doesn't grant access to a specific user, the /etc/at.deny
file is checked.
Users not listed in /etc/at.deny
are allowed to use the at
and batch
commands.
If /etc/at.deny
is empty, all users have the privilege to use the at
command.
If neither /etc/at.allow
nor /etc/at.deny
exists, only the superuser (root) is allowed to use the at
and batch
commands.
The /etc/at.allow
file takes precedence over /etc/at.deny
file. If a user is listed in both files, access is granted based on /etc/at.allow
.
These files provide a simple yet effective means of controlling which users can utilize the at
and batch
commands to schedule tasks for later execution on the system.
Let us see how to restrict users from using at
command with an example.
To restrict users from using the at
command, you can utilize the /etc/at.allow
and /etc/at.deny
files. Here's how you can do it:
10.1. Using /etc/at.deny
Open the /etc/at.deny
file with a text editor and add the usernames of the users you want to restrict, each on a separate line. Save and exit the file.
For example, to restrict users "user1" and "user2," you can run:
$ echo "user1" | sudo tee -a /etc/at.deny $ echo "user2" | sudo tee -a /etc/at.deny
Now switch to any restricted user and try to run any 'at' command:
$ su - user1 $ atq You do not have permission to use atq.
10.2. Using /etc/at.allow
If you prefer allowing only specific users to use the at
command, you can create the /etc/at.allow
file and add the usernames of the users who are allowed to use the command, each on a separate line.
Save and exit the file.
For example, to allow only "ostechnix" to use the at
command, you can run:
$ echo "ostechnix" | sudo tee -a /etc/at.allow
Remember that the /etc/at.allow
file takes precedence over the /etc/at.deny
file. If a username is listed in both files, the user will be allowed to use the at
command.
After making these changes, the users you have restricted will no longer be able to use the at
command.
11. Execute Jobs When System Load Permits
The "batch
" command carries out tasks when the system's load conditions are favorable. Specifically, it triggers execution when the load average falls below 1.5 or the specified value set during the invocation of the "atd
" daemon. This approach helps ensure that the jobs run during periods of lower system activity.
Here's how you can use the batch
command to execute jobs when the system load permits:
1. Open a terminal.
2. Type batch
and press Enter. This will initiate the batch
command and provide you with a prompt where you can enter the commands you want to execute.
3. Enter the commands you want to execute once the system load drops below the threshold. For example:
echo "Job started at $(date)" >> job_log.txt sleep 5 echo "Job finished at $(date)" >> job_log.txt
In this example, the job logs the start time, waits for 5 seconds using the sleep
command, and then logs the finish time.
4. Press Ctrl + D
to indicate that you're done entering commands. The commands you entered will be queued for execution when the system's load average is below the threshold.
5. The system will execute the queued commands when the load average drops below the specified threshold, which is usually around 1.5.
6. Verify if the batch job is completed by viewing the contents of job_log
txt file.
$ cat job_log.txt Job started at Wednesday 09 August 2023 03:48:06 PM IST Job finished at Wednesday 09 August 2023 03:48:11 PM IST
Keep in mind that the batch
command relies on the system's load conditions, so there might be a delay before your jobs actually run, depending on the load on the system at the moment.
It's worth noting that the actual behavior of the batch
command may vary slightly depending on the specific implementation on your system.
Time Expressions
The at
command accepts various time formats for scheduling jobs. For instance, you can use HH:MM
to schedule a job at a particular time of the day. If that time has already passed, the job is assumed to run on the next day.
Notably, you have the option to specify specific times like midnight, noon, or teatime (4pm). Additionally, you can suffix a time with AM or PM to indicate morning or evening.
You can also indicate the day the job should be executed. This can be done by providing a date in formats such as month-name day (with an optional year), MMDD[CC]YY
, MM/DD/[CC]YY
, DD.MM.[CC]YY
, or [CC]YY-MM-DD
. The date specification must follow the time of day specification.
Moreover, you have the flexibility to define relative times, such as now + count time-units. The time-units can be minutes, hours, days, or weeks.
To specify running a job today, you can simply suffix the time with "today." Similarly, suffixing the time with "tomorrow" will schedule the job for the following day.
Examples:
For instance, if you wish to run a job at 2pm 5 days from now, you can use the syntax:
at 2pm + 5 days
To schedule a job for 11:00am on August 31, you can use:
at 11am Aug 31
For a job at 3am tomorrow, the command would be:
at 3am tomorrow
In cases where you specify a job to run at a time and date in the past, the job will execute as soon as possible. For example, if it's currently 11pm and you schedule a job for 9pm on the same day using at 9pm today
, the job is likely to run around 11:05pm.
The following table provides a clear breakdown of the different time expressions and how they can be used to schedule jobs using the at
command.
Time Expression | Description | Example |
---|---|---|
HH:MM | Schedule a job at a specific time of day. | at 4pm |
midnight, noon, teatime | Special times of the day. | at midnight |
AM or PM | Morning or evening time specification. | at 8:30AM |
month-name day | Specify a job's day with an optional year. | at 10am Jul 31 |
MMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY, [CC]YY-MM-DD | Various date formats. | at 03142230 (for March 14, 2023, 10:30 PM) |
now + count time-units | Relative time specification. | at now + 2 hours |
today, tomorrow | Schedule a job for today or tomorrow. | at 1am tomorrow |
You can find further details about the time specification format in the file /usr/share/doc/at/timespec
.
Linux at Command Cheat Sheet
Here's the Linux at
command cheat sheet in a tabular column format. Please print it and keep it nearby for quick reference.
Task | Command | Example |
---|---|---|
Schedule at a specific time | at <time> | at 3:30 PM |
Schedule after a delay | at now + <time> | at now + 2 hours |
Schedule using a script file | at <time> -f <script_file> | at 9:00 AM tomorrow -f script.sh |
Interactive prompt | at | |
Execute commands | at <time> <<< "command" | at 5:00 PM <<< "backup.sh" |
View pending jobs | atq or at -l | |
Remove a job | atrm <job_id> or at -r <job_id> | atrm 3 or at -r 3 |
View job contents | at -c <job_id> | at -c 5 |
Send email notifications | echo "command" | at -m <time> | echo "backup.sh" | at -m 11:00 PM |
Suppress email notifications | echo "command" | at -M <time> | echo "command" | at -M 8:00 AM |
Access help | at -h or man at |
Remember that the at
command's behavior may vary slightly between different Linux distributions. Use this cheat sheet as a quick reference guide for using the at
command effectively.
Frequently Asked Questions
Here's a list of FAQs for Linux at
and batch
commands.
at
command in Linux?A: The at
command is a utility in Linux that allows you to schedule one-time tasks or commands to run at a specific time in the future. It's particularly useful for automating tasks without requiring user intervention.
at
command to schedule jobs?A: To schedule tasks using Linux at
command, follow the steps below:
1. Open a terminal.
2. Use the following syntax to schedule a job:at [time] [date]
For example:at 10:30AM tomorrow
3. Press Enter and you'll enter an interactive prompt where you can enter the commands you want to execute.
4. Press Ctrl + D when you're done entering commands to schedule the job.
A: Yes, you can use the -f
option to specify a file containing the commands you want to execute. For example:at 2:00PM -f script.sh
A: Use the atq
command to list the pending jobs along with their job IDs and scheduled times.
A: Yes, you can use the -c
option followed by the job ID to display the contents of a previously scheduled job. For example:at -c 123
A: You can use the atrm
command followed by the job ID to remove a scheduled job. For example:atrm 123
A: By default, the at
command sends email notifications about completed jobs. You can enable it even for jobs with no output using the -m
option.
A: Yes, you can disable this behavior using the -M
option.
A: You can use formats like HH:MM, midnight, noon, teatime, specific dates (e.g., Jul 31, 2023), relative times (e.g., now + 2 hours), today, and tomorrow.
at
command for recurring tasks?A: No, the at
command is designed for one-time scheduling. For recurring tasks, consider using the cron
command.
batch
command?A: The batch
command is a utility that allows you to schedule jobs to run when the system's load average drops below a certain threshold, typically around 1.5. It helps ensure that jobs are executed during periods of lower system activity.
batch
command work?A: The batch
command schedules jobs to run in a queue when the system's load conditions permit. It monitors the load average and initiates job execution when the load drops below the specified threshold.
batch
command?A: The batch
command usage is same as at
command's.
1. Open a terminal.
2. Type batch
and press Enter to start the batch
command.
3. Enter the commands you want to execute when the load drops below the threshold.
4. Press Ctrl + D to indicate the end of command input.
batch
command?A: The batch
command is ideal for non-urgent tasks that can be executed when the system is less busy. Examples include data backups, log analysis, or resource-intensive tasks that can be postponed until the system load decreases.
batch
?A: You can use the atq
command to check the status of pending jobs scheduled with batch
. It will display the list of jobs in the queue along with their job IDs.
batch
command?A: Yes, you can cancel scheduled jobs using the atrm
command followed by the job ID. For example, atrm 123
will remove job number 123 from the queue.
at
and batch
commands?A: To access help for the at
command, simply type at -h
or man at
in the terminal. You can also locate the help section for the batch
command within the manual page of the at
command.
Conclusion
In conclusion, the Linux at command is a handy tool that lets you schedule tasks to happen at specific times in the future. It's like setting an alarm for your computer to do things for you automatically.
So, whether you're new to Linux or an experienced user, the Linux at command can make your life easier by taking care of tasks at the right time.