Troubleshoot the Modern Splunk SOAR Automation Broker

troubleshooting for Modern automation brokers

Troubleshoot Podman restart loops caused by a stale common PID file

What you see

The Automation Broker starts, appears healthy until the configured systemd startup-timeout interval expires, receives SIGTERM, and might later be killed with SIGKILL. systemd then starts it again. The journal typically repeats at that interval:

CODE
container-soar_ab_example.service: Can't open PID file .../<old-container-id>/userdata/conmon.pid
container-soar_ab_example.service: start operation timed out. Terminating.
container-soar_ab_example.service: State 'stop-sigterm' timed out. Killing.
container-soar_ab_example.service: Failed with result 'timeout'.

The application log might only show that Automation Broker received SIGTERM; systemd is the component sending it.

Source:Red Hat systemd timeout documentation, systemd.service(5)

Why it happens

The Automation Broker container was removed and recreated with the same explicit name but a new container ID. Its legacy generated systemd unit still combines:

  • ExecStart= that finds the replacement container by name.

  • PIDFile= that contains the previous container's ID.

Podman successfully starts the replacement, but systemd waits for a PID file that can no longer exist. When the startup timeout expires, systemd terminates and restarts the service. Increasing the timeout does not fix the stale path.

Sources: Podman run --name documentation,

Podman-generated systemd unit documentation

Confirm the issue

Run these commands as the rootless user that owns Automation Broker (sa_soar in this example):

JSON
CONTAINER="soar_ab_example"
SERVICE="container-soar_ab_example.service"
export XDG_RUNTIME_DIR="/run/user/$(id -u)"
export DBUS_SESSION_BUS_ADDRESS="unix:path=$XDG_RUNTIME_DIR/bus"
podman inspect --format \
  'ID={{.Id}}
ConmonPidFile={{.ConmonPidFile}}' \
  "$CONTAINER"
systemctl --user show "$SERVICE" \
  -p PIDFile \
  -p ExecStart \
  -p TimeoutStartUSec

If systemctl --user reports Failed to connect to bus, inspect the unit file directly:

CODE
sed -n '1,240p' \
  "$HOME/.config/systemd/user/$SERVICE"

The issue is confirmed when the unit's PIDFile= contains a different container ID from Podman's ConmonPidFile, while ExecStart= starts the current container by name. The journal shows the matching PID-file and startup-timeout errors:

CODE
journalctl --user -u "$SERVICE" \
  --since "15 minutes ago" \
  --no-pager

Sources: Podman inspect documentation, systemd.service(5) PID-file behavior

Fix the stale unit

If an installer or configuration-management system owns the service, use its repair procedure. Otherwise, regenerate the legacy unit for the current container. Run these commands as sa_soar:

CODE
REPAIR_STARTED_AT=$(date --iso-8601=seconds)
UNIT="$HOME/.config/systemd/user/$SERVICE"
WORKDIR=$(mktemp -d)
cp -a "$UNIT" \
  "${UNIT}.bak.$(date +%Y%m%d%H%M%S)"
systemctl --user stop "$SERVICE"
(
  cd "$WORKDIR"
  podman generate systemd \
    --name \
    --files \
    "$CONTAINER"
)
install -D -m 0644 \
  "$WORKDIR/$SERVICE" \
  "$UNIT"
systemctl --user daemon-reload
systemctl --user enable --now "$SERVICE"

This replaces the stale PIDFile= with the path for the current container. Do not try to solve this by increasing TimeoutStartSec; systemd would only wait longer for the wrong file. The Quadlet procedure in the next section is the preferred long-term configuration because it does not preserve a generated unit tied to an old container ID.

If systemctl --user still cannot connect to the bus, restore access to the sa_soar systemd user manager before applying the repair; changing the file alone does not reload the running manager.

Sources: Podman-generated systemd unit documentation, Red Hat systemd unit reload procedure

Verify

JSON
systemctl --user status "$SERVICE" --no-pager -l
printf 'systemd: %s\n' \
  "$(systemctl --user show "$SERVICE" -p PIDFile --value)"
printf 'Podman:  %s\n' \
  "$(podman inspect --format '{{.ConmonPidFile}}' "$CONTAINER")"

The service should remain active (running) beyond the configured TimeoutStartUSec interval shown during confirmation, and both PID-file paths should identify the current container. After that interval has passed, check the journal once for new errors:

CODE
journalctl --user -u "$SERVICE" \
  --since "$REPAIR_STARTED_AT" \
  --no-pager

The repair is complete if there are no new Can't open PID file or start operation timed out messages. Investigate SELinux denials or application errors separately if they remain; they do not explain a confirmed stale PID-file mismatch.