svcadm(8) on Solnix vs Linux and the BSDs
svcadm is the illumos command at /usr/sbin/svcadm that asks the service management facility (SMF) to act on service instances named by FMRI. The service's restarter, svc.startd by default, carries out the request. You enable a service with a svcadm subcommand; the page names no rc.conf-style file to edit, unlike FreeBSD sysrc or OpenBSD rcctl.
The manual pages
- Solnix: svcadm(8) from
pkgs.solnix.illumos-world-man· illumos.org - Linux: systemctl(1) systemd-260.5 (different command, similar job)
- FreeBSD: service(8) 15.1-RELEASE (different command, similar job)
- FreeBSD: sysrc(8) 15.1-RELEASE (different command, similar job)
- OpenBSD: rcctl(8) 8.0 (different command, similar job)
- NetBSD: service(8) 11.0 (different command, similar job)
What Solnix runs
A default Solnix system runs the illumos svcadm at /usr/sbin/svcadm. No other variants are shipped. To list services and their states, see svcs(1). svcadm only changes them.
Differences
| Compared with | Topic | What differs |
|---|---|---|
| all four | service model | svcadm sends requests to SMF, and each service's assigned restarter (default svc.startd) performs them. systemctl controls systemd units. FreeBSD and NetBSD service, and OpenBSD rcctl, run rc.d(8) scripts. Source: Solnix svcadm(8) DESCRIPTION; Linux systemctl(1) DESCRIPTION; FreeBSD service(8) DESCRIPTION; NetBSD service(8) DESCRIPTION; OpenBSD rcctl(8) DESCRIPTION |
| FreeBSD, OpenBSD | where boot-time enablement lives | FreeBSD records enablement in rc.conf(5) files (by default /etc/rc.conf /etc/rc.conf.local), edited with sysrc. OpenBSD rcctl enable writes rc.conf.local(8). The svcadm page names no configuration file: you run svcadm enable or disable on the FMRI.Source: FreeBSD sysrc(8) DESCRIPTION (rc_conf_files); OpenBSD rcctl(8) enable, set; Solnix svcadm(8) SYNOPSIS |
| Linux, OpenBSD | failed services and maintenance | On Solnix, a service whose start method hangs moves to the maintenance state when its method timeout expires, and cannot come online without administrator intervention. Linux lists failed units with --failed or --state=failed. OpenBSD uses rcctl ls failed.Source: Solnix svcadm(8) NOTES; Linux systemctl(1) --state; OpenBSD rcctl(8) ls |
| Linux | selecting by state | svcadm -S state applies the subcommand to every FMRI in that state. systemctl --state= only filters what list-units, list-dependencies, show and status display.Source: Solnix svcadm(8) -S; Linux systemctl(1) --state |
| all four | exit status 3 and 4 | svcadm exits 3 when an instance it waited for cannot reach the desired state because of a problem with the instance itself, and 4 when the problem is in its dependencies. 2 means invalid options. Source: Solnix svcadm(8) EXIT STATUS |
| FreeBSD, OpenBSD, NetBSD | BSD exit status | OpenBSD rcctl action returns the rc.d script's exit status, and 2 means a non-existent daemon. NetBSD service exits 1 when the script does not exist. FreeBSD service documents only 0 or >0. Source: OpenBSD rcctl(8) EXIT STATUS; NetBSD service(8) EXIT STATUS; FreeBSD service(8) EXIT STATUS |
| Linux, FreeBSD | zones, jails, containers | From the global zone, svcadm -z zone acts on services in one zone and -Z acts on all zones. FreeBSD service and sysrc take -j jail. systemctl -r/--recursive also lists units of local containers.Source: Solnix svcadm(8) -z, -Z; FreeBSD service(8) -j; FreeBSD sysrc(8) -j; Linux systemctl(1) -r |
| FreeBSD, NetBSD | environment of started services | FreeBSD and NetBSD service run rc.d scripts with HOME=/ and PATH=/sbin:/bin:/usr/sbin:/usr/bin; NetBSD also sets umask 022. The svcadm page does not describe the environment, because the restarter starts the service.Source: FreeBSD service(8) ENVIRONMENT; NetBSD service(8) ENVIRONMENT; Solnix svcadm(8) DESCRIPTION |
| FreeBSD, OpenBSD, NetBSD | naming services | svcadm takes FMRIs or FMRI patterns. The BSD tools take an rc.d script or daemon name with no path prefix. Source: Solnix svcadm(8) SYNOPSIS; NetBSD service(8) -e; OpenBSD rcctl(8) SYNOPSIS; FreeBSD service(8) SYNOPSIS |
Everyday tasks
| Task | Solnix | Linux | FreeBSD | OpenBSD | NetBSD |
|---|---|---|---|---|---|
| enable a service | svcadm enable FMRI | — | sysrc name=value (rc.conf variable) | rcctl enable daemon | — |
| disable a service | svcadm disable FMRI | — | sysrc name=value (rc.conf variable) | rcctl disable daemon | — |
| start or stop a service now | — | — | service script start | stop | rcctl start | stop daemon | service rc_script_name start |
| restart a service | svcadm restart FMRI | — | — | rcctl restart daemon | service rc_script_name restart |
| check whether a service is enabled | see svcs(1) | systemctl is-enabled unit | service -e | rcctl get daemon status | service -e rc_script_name |
| show a service's status | see svcs(1) | systemctl status unit | — | — | service rc_script_name status |
| list failed services | see svcs(1) | systemctl list-units --state=failed | — | rcctl ls failed | — |
| list all services | see svcs(1) | systemctl list-units --all | service -l | rcctl ls all | service -l |
Standards
- POSIX: svcadm is not a POSIX.1-2024 utility.
- Solnix: Interface Stability: the interactive output is Uncommitted; the invocation and non-interactive output are Committed.
Writing portable scripts
- Branch on the tool that is present (svcadm, systemctl, rcctl, service/sysrc) instead of assuming one. Enablement is SMF state on Solnix, rc.conf files on FreeBSD and OpenBSD, and units on Linux.
- Check exit status, not output: svcadm's non-interactive output is Committed, but its interactive output is Uncommitted.
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.