at(1) on Solnix vs Linux and the BSDs
On Solnix, at and batch are the illumos programs in /usr/bin. The biggest trap is -c: it selects the C shell to run the job, whereas on Linux, FreeBSD, OpenBSD and NetBSD -c prints the queued job to standard output. Solnix also has -p project, no atq/atrm pages and different queue defaults.
The manual pages
- Solnix: at(1) from
pkgs.solnix.illumos-world-man· illumos.org - Linux: at(1) at-3.2.5
- FreeBSD: at(1) 15.1-RELEASE
- OpenBSD: at(1) 8.0
- NetBSD: at(1) 11.0
- Standard: POSIX.1-2024 (IEEE Std 1003.1-2024),
at
What Solnix runs
A default Solnix system runs the illumos /usr/bin/at, with batch alongside it. /usr/xpg4/bin/at and /usr/xpg4/bin/batch are also shipped with the same synopsis. The one documented difference is that /usr/bin/batch is equivalent to 'at -q b now', while /usr/xpg4/bin/batch is equivalent to 'at -q b -m now', so it always sends mail. The bundle does not document any other xpg4 difference.
Differences
| Compared with | Topic | What differs |
|---|---|---|
| all four | -c meaning | Solnix at -c runs the job under csh(1). On Linux, FreeBSD, OpenBSD and NetBSD, -c job prints the listed jobs to standard output. A script that uses at -c to inspect a job will instead try to submit a job under csh on Solnix.Source: Solnix at(1) -c; Linux at(1) -c; FreeBSD at(1) -c; OpenBSD at(1) -c; NetBSD at(1) -c |
| all four | shell that runs the job | Solnix uses -c, -k or -s to pick csh, ksh or sh. Without them it uses SHELL, or /usr/bin/sh if SHELL is unset or empty. Linux, FreeBSD and NetBSD say the job runs with sh. OpenBSD uses SHELL, then the password database shell, then sh.Source: Solnix at(1) OPTIONS; Linux at(1) DESCRIPTION; FreeBSD at(1) DESCRIPTION; NetBSD at(1) DESCRIPTION; OpenBSD at(1) DESCRIPTION |
| all four | default queues | On Solnix, at jobs go to queue a and batch to queue b. Queue c is reserved for cron and cannot be used with -q. Only lowercase a to z are valid. FreeBSD, OpenBSD and NetBSD default to c for at and E for batch, and accept A to Z, where an uppercase queue means batch. Linux defaults to a and b.Source: Solnix at(1) -q; FreeBSD at(1) -q; OpenBSD at(1) -q; NetBSD at(1) -q; Linux at(1) -q |
| OpenBSD | OpenBSD page contradicts itself on queues | The OpenBSD OPTIONS text says c is the default queue for at and E for batch. Its STANDARDS section says at jobs go in queue a and batch jobs in queue b. The manual does not reconcile the two. Source: OpenBSD at(1) -q; OpenBSD at(1) STANDARDS |
| all four | access control files | Solnix reads /usr/lib/cron/at.allow and at.deny. If neither exists, only a user with the solaris.jobs.user authorization may submit jobs. Linux uses /etc/at/, FreeBSD and NetBSD use /var/at/, and OpenBSD uses /var/cron/. FreeBSD, NetBSD and OpenBSD allow only the superuser when neither file exists.Source: Solnix at(1) DESCRIPTION; Linux at(1) DESCRIPTION; FreeBSD at(1) DESCRIPTION; NetBSD at(1) DESCRIPTION; OpenBSD at(1) DESCRIPTION |
| OpenBSD, NetBSD | empty at.deny | On Solnix, an empty at.deny permits global use, but only when at.allow does not exist and at.deny does. OpenBSD and NetBSD also say an empty at.deny means every user may use at, and give it as the default configuration. Solnix gives no default. Source: Solnix at(1) DESCRIPTION; OpenBSD at(1) DESCRIPTION; NetBSD at(1) DESCRIPTION |
| Linux, FreeBSD, NetBSD | atq, atrm and -d | The Solnix page lists no atq or atrm. Use at -l to list and at -r to remove. Linux, FreeBSD and NetBSD document atq and atrm, and -d as an alias for atrm. Solnix has no -d. NetBSD makes -l and -r aliases for atq and atrm.Source: Solnix at(1) SYNOPSIS, -l, -r; Linux at(1) SYNOPSIS, -d; FreeBSD at(1) SYNOPSIS, -d; NetBSD at(1) SYNOPSIS, -d, -l, -r |
| all four | batch invocation and load rule | Solnix batch accepts only -p project and reads standard input. It submits to queue b for immediate execution, delayed only by concurrent-job limits in queuedefs(5). The other systems document a load-average threshold (Linux 0.8, FreeBSD 1.5 times active CPUs, OpenBSD and NetBSD 1.5). Their batch takes a time or timespec, and -f and -q.Source: Solnix at(1) batch; Linux at(1) batch; FreeBSD at(1) batch; OpenBSD at(1) SYNOPSIS; NetBSD at(1) SYNOPSIS |
| all four | -p project | Solnix at and batch take -p project to run the job under a project, and to filter -l output. None of the Linux, FreeBSD, OpenBSD or NetBSD pages documents -p.Source: Solnix at(1) SYNOPSIS, -p; Linux at(1) OPTIONS; FreeBSD at(1) OPTIONS; OpenBSD at(1) OPTIONS; NetBSD at(1) OPTIONS |
| Linux, FreeBSD, NetBSD | -v and -V | Solnix has neither -v nor -V. Linux, FreeBSD and NetBSD have -v, which shows the execution time (for atq on FreeBSD and NetBSD, also completed but undeleted jobs). Linux and NetBSD have -V, which prints the version. OpenBSD has neither.Source: Solnix at(1) SYNOPSIS; Linux at(1) -v, -V; FreeBSD at(1) -v; NetBSD at(1) -v, -V |
| Linux | Linux-only mail and listing options | Linux at has -M (never send mail), -u username (mail someone else) and -o fmt (job list time format). The Solnix page documents none of these.Source: Linux at(1) -M, -u, -o; Solnix at(1) SYNOPSIS |
| all four | job environment and locked accounts | Solnix keeps the environment, working directory, umask and, for sh and ksh, resource limits. It runs the job in a separate process group with no controlling terminal, and skips jobs of locked accounts. The other pages list excluded variables, which the Solnix page does not. Source: Solnix at(1) DESCRIPTION; Linux at(1) DESCRIPTION; FreeBSD at(1) DESCRIPTION; OpenBSD at(1) DESCRIPTION; NetBSD at(1) DESCRIPTION |
| FreeBSD | scheduling granularity | FreeBSD implements at through cron(8) calling atrun(8) every five minutes, so timing may be coarse. The Solnix page describes no such interval. Source: FreeBSD at(1) IMPLEMENTATION NOTES; Solnix at(1) DESCRIPTION |
Standards
- POSIX: at is a POSIX.1-2024 utility.
- NetBSD: The at and batch utilities conform to IEEE Std 1003.2-1992 (“POSIX.2”).
- OpenBSD: The at and batch utilities are compliant with the specification (name elided in the text). The at flags
-band-cand the teatime timespec are extensions. The at.allow/deny mechanism is marked as an X/Open System Interfaces option. - Linux: The page says its time specifications extend the POSIX.2 standard.
Writing portable scripts
- Do not use
-c,-k,-s,-d,-vor-pin portable scripts: they differ between systems or exist on only some. Set the shell inside the job script, and use at-land at-rfor listing and removal. - Use
-t[[CC]YY]MMDDhhmm[.SS] (touch-style) or plain HH:MM times and avoid teatime, 'next' and other extensions. Do not rely on a default queue name.
Every difference here is taken from the manual pages linked above: Solnix's published page, Linux (man-pages and the GNU and util-linux manuals), FreeBSD, OpenBSD and NetBSD. Each row names its source. Where a manual is silent, this page is too. Compiled 2026-10-26. Found a mistake? Mail hackers@lists.solnix.io.