atd daemon allows Linux administrators to schedule one-time batch jobs for execution at a specific future time. This tool is ideal for tasks that require only 5-10 minutes of runtime but should not run during peak business hours, such as log rotation or temporary file cleanup. Unlike cron, which handles recurring schedules, at provides precise control over single-event executions without the complexity of repeated triggers.
Understanding the atd Service
Theatd service runs in the background and reads job queues from the /var/spool/at directory. When you submit a job using the at command, it is stored in this queue until the scheduled time arrives. The daemon then executes the job in the context of the user who submitted it. It is crucial to ensure the atd service is active on your system. On most modern distributions, you can check its status with systemctl status atd. If it is inactive, enable and start it using sudo systemctl enable --now atd.
Without this service running, any jobs submitted via at will remain in the pending queue indefinitely and never execute. This is a common point of confusion for new users who believe their script failed when it simply was never triggered.
Scheduling Jobs with the at Command
To schedule a job, use theat command followed by a time specification. You can specify time in various formats, including standard clock time, relative times like now + 5 minutes, or absolute dates. For example, to run a backup script at 2:00 AM tomorrow, you would type:
at 2:00 AM tomorrow
After entering the time, the shell presents an at> prompt where you can enter the commands to be executed. Press Enter after each line. Once you have finished entering all commands, press Ctrl+D to signal the end of input. The system will respond with a message indicating the job number and the scheduled execution time.
For more complex scenarios, you can pipe commands directly into at. This is useful for scripting automated deployments. For instance:
echo "backup.sh" | at 3:00 AM
This approach bypasses the interactive prompt and submits the job immediately. However, be aware that if your script involves filenames with spaces or special characters, you must handle quoting carefully. See our guide on Troubleshooting Bash Script with Suspected Issues of Spaces, Dashes, Filenames and Quoting for detailed advice on managing these edge cases.
Managing and Monitoring Queued Jobs
Once jobs are queued, you may need to monitor them or remove them before execution. Theatq command lists all pending jobs for the current user. Each entry includes a job ID, which is essential for management operations. To view the actual commands contained within a specific job, use at -c <job_id>. This displays the script content without executing it, allowing you to verify correctness.
If you need to cancel a pending job, use the atrm command followed by the job ID. For example, atrm 5 removes job number 5 from the queue. This is particularly useful when testing scripts or if a job is no longer required due to changed circumstances. Note that you can only manage jobs submitted by your own user account. Root users can manage all jobs on the system.
Running Jobs with Elevated Privileges
A frequent requirement is running a batch job with root privileges, such as updating system packages or modifying system logs. Theat command does not have a built-in flag to change the user context for the job itself. Therefore, attempting to use flags like -f to run as another user is incorrect and unsupported. Instead, you must explicitly invoke privilege escalation within the job script.
You have two primary options for handling elevated permissions. First, you can use sudo inside the job definition. Ensure that the submitting user has appropriate sudoers permissions to run the target command without a password prompt, or configure sudo to allow non-interactive execution. Second, you can submit the job directly as the root user by using sudo at 2:00 AM. In this case, the job runs natively as root, avoiding the need for internal sudo calls. Choose the method that best fits your security policy. Direct submission as root is often simpler for administrative tasks, while sudo within the script offers more granular control if multiple users share the scheduling infrastructure.
Optimizing Job Completion Times
Batch jobs that take longer than expected can cause resource contention or miss subsequent scheduled tasks. To optimize performance, avoid running I/O-intensive operations during peak hours. Use tools likeionice to prioritize lower disk access priority for your batch jobs. For example, prefixing your command with ionice -c 3 ensures the job yields to higher-priority processes.
Additionally, consider using nice to adjust CPU priority. Combining both gives you fine-grained control: ionice -c 3 nice -n 19 your_command. This ensures that even if the system is under heavy load, your batch job will not significantly impact user experience. Always test your scripts in a staging environment to estimate runtime accurately. Refer to Setting Cron Job Runs on Monday of Week 3 and Thursday if you later decide to switch to recurring schedules for similar tasks.
Frequently Asked Questions
Can I see the output of a completed at job?
No, at does not automatically capture stdout or stderr. To preserve output, you must redirect it manually in your command, such as appending > /tmp/job_output.log to your script. Without redirection, the output is discarded after execution.
What happens if the system is powered off at the scheduled time?
The job will execute as soon as possible after the system boots up. The atd daemon checks the queue upon startup and processes any missed deadlines. However, relying on this behavior is risky for critical tasks, so ensure your server remains powered on.
How do I delete all pending jobs for my user?
You can list all job IDs using atq and then remove them individually with atrm. There is no single command to clear all jobs, so you may need to parse the atq output in a loop if you have many pending tasks.
Is atd secure for sensitive data processing?
Jobs are stored in plain text in the /var/spool/at directory. While permissions restrict access to the owner and root, it is not encrypted. Avoid storing passwords or sensitive keys directly in the job script. Use environment variables or secure credential managers instead.
Can I schedule a job to repeat every hour?
No, at is designed for one-time execution. For recurring tasks, you must use cron. Using at for repetition requires manually rescheduling the job within the script itself, which is inefficient and error-prone compared to standard cron entries.