In the Linux ecosystem, cron is famously used for scheduling recurring, periodic tasks. However, Ubuntu Server also includes the at daemon (atd), a separate job scheduler designed specifically for executing one-off commands at a specific time in the future. While useful for queuing a single script to run at midnight, atd is rarely utilized in modern, heavily automated server environments that rely on systemd timers, Ansible, or external CI/CD pipelines. Leaving an unused scheduling daemon running in the background simply consumes unnecessary RAM and introduces a minor, theoretical vector for privilege escalation if the daemon’s spool directory permissions are ever misconfigured.
This guide explains how to completely disable the atd daemon in Ubuntu Server to streamline your operating system.
Stop and Mask the atd Daemon via Systemctl
Because the at daemon is managed by systemd, we must stop the active process, disable it from loading during the boot sequence, and mask it to prevent any dependencies from waking it up.
- Log into your Ubuntu Server via SSH or local console with
sudoprivileges. - First, check the status of the daemon to ensure it is currently running:
systemctl status atd.service - Stop the active service immediately:
sudo systemctl stop atd.service - Disable the service so it does not load upon the next system reboot:
sudo systemctl disable atd.service - Mask the service to link its configuration to
/dev/null, making it completely impossible to start:sudo systemctl mask atd.service
Verify the Scheduler is Disabled
Once the daemon is masked, the system can no longer process queued jobs. To verify this mathematically, attempt to use the at command to schedule a simple task.
Run the following command in your terminal:
echo "hello" | at now + 1 minute
Instead of queuing the job, the system will immediately return an error message stating: “Can’t open /var/run/atd.pid to signal atd. No atd running?”
This confirms that the daemon is completely paralyzed. Any users or scripts attempting to utilize the at command will fail, ensuring your server only executes scheduled tasks through your explicitly approved modern orchestration tools.