A Linux service outage needs a short triage path before restarts or configuration edits change the evidence. The first useful signal is the systemd unit state, because it shows whether the daemon failed to start, exited after launch, timed out, or is still running while the application remains unreachable.
systemctl reports the service state that systemd is tracking, while journalctl shows the start attempt, exit status, and daemon messages around the incident. For network-facing services, ss confirms which process owns the expected port, which separates process failures from firewall, routing, and proxy problems.
Collect the state and journal lines before applying a fix so later restarts do not replace the original failure with a new symptom. The commands use apache2.service failing because another web server owns port 80 as a concrete outage signal; replace the unit name and port with the affected service.
$ sudo systemctl status --no-pager --full apache2.service
× apache2.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Sat 2026-06-13 20:46:10 UTC; 11s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 111 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)
Main PID: 111 (code=exited, status=1/FAILURE)
Status: "Reading configuration..."
##### snipped #####
Jun 13 20:46:10 host.example.net apachectl[111]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
Jun 13 20:46:10 host.example.net apachectl[111]: no listening sockets available, shutting down
Jun 13 20:46:10 host.example.net systemd[1]: apache2.service: Failed with result 'exit-code'.
Jun 13 20:46:10 host.example.net systemd[1]: Failed to start apache2.service - The Apache HTTP Server.
Use the exact .service unit from the alert or application handoff. If the unit is unknown, list failed services with systemctl --failed --type=service.
Related: How to check Linux service status
$ sudo journalctl --unit=apache2.service --boot --no-pager --lines=20 Jun 13 20:46:06 host.example.net systemd[1]: Starting apache2.service - The Apache HTTP Server... Jun 13 20:46:06 host.example.net apachectl[58]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 Jun 13 20:46:06 host.example.net apachectl[58]: no listening sockets available, shutting down Jun 13 20:46:06 host.example.net systemd[1]: apache2.service: Main process exited, code=exited, status=1/FAILURE Jun 13 20:46:06 host.example.net systemd[1]: apache2.service: Failed with result 'exit-code'. Jun 13 20:46:06 host.example.net systemd[1]: Failed to start apache2.service - The Apache HTTP Server. Jun 13 20:46:10 host.example.net systemd[1]: Starting apache2.service - The Apache HTTP Server... Jun 13 20:46:10 host.example.net apachectl[111]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 Jun 13 20:46:10 host.example.net apachectl[111]: no listening sockets available, shutting down Jun 13 20:46:10 host.example.net systemd[1]: apache2.service: Failed with result 'exit-code'.
Start with the earliest failure in the window; repeated restarts often duplicate the same message.
Related: How to view Linux service logs with journalctl
$ systemctl show apache2.service --property=LoadState,ActiveState,SubState,Result,ExecMainStatus,NRestarts LoadState=loaded ActiveState=failed SubState=failed Result=exit-code NRestarts=0 ExecMainStatus=1
Result=exit-code and ExecMainStatus=1 identify a failed start. NRestarts shows automatic restarts tracked for the unit.
$ sudo ss --listening --tcp --numeric --processes '( sport = :80 )'
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=5))
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=1234,fd=6))
A listener owned by a different daemon explains the bind failure. For non-network services, inspect the failed path, dependency, socket, queue, or credential named in the journal instead.
Related: How to check if a Linux service is listening on a port
$ sudo systemctl stop nginx.service
Choose the service that should give up the port before stopping anything; stopping the wrong service can extend the outage.
$ sudo systemctl reset-failed apache2.service
reset-failed also clears the per-unit start-rate counter, which matters when start-limit-hit prevented another start attempt.
$ sudo systemctl start apache2.service
$ systemctl show apache2.service --property=ActiveState,SubState,Result,ExecMainStatus,NRestarts ActiveState=active SubState=running Result=success NRestarts=0 ExecMainStatus=0
$ sudo ss --listening --tcp --numeric --processes '( sport = :80 )'
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("apache2",pid=1234,fd=3))
$ nc -vz 127.0.0.1 80 Connection to 127.0.0.1 80 port [tcp/*] succeeded!
A successful TCP connection proves the socket accepts a handshake. For HTTP, SSH, databases, or queues, follow with a protocol-level request from the application path.