phacility/phabricator · critical · Exception
Failed to %s!
Error message
Failed to %s!
What it means
Thrown in the daemonization path when pcntl_fork() returns a negative value, i.e. the OS refused to create a child process. This is an environment-level failure (not config), reported by the parent CLI process before it exits; the '%s' in the template is filled with 'fork()'.
Source
Thrown at src/applications/aphlict/management/PhabricatorAphlictManagementWorkflow.php:456
/* -( Commands )----------------------------------------------------------- */
final protected function executeStartCommand() {
$console = PhutilConsole::getConsole();
$this->willLaunch();
$log = $this->getOverseerLogPath();
if ($log !== null) {
echo tsprintf(
"%s\n",
pht(
'Writing logs to: %s',
$log));
}
$pid = pcntl_fork();
if ($pid < 0) {
throw new Exception(
pht(
'Failed to %s!',
'fork()'));
} else if ($pid) {
$console->writeErr("%s\n", pht('Aphlict Server started.'));
exit(0);
}
// Redirect process errors to the error log. If we do not do this, any
// error the `aphlict` process itself encounters vanishes into thin air.
if ($log !== null) {
ini_set('error_log', $log);
}
// When we fork, the child process will inherit its parent's set of open
// file descriptors. If the parent process of bin/aphlict is waiting for
// bin/aphlict's file descriptors to close, it will be stuck waiting on
// the daemonized process. (This happens if e.g. bin/aphlict is startedView on GitHub (pinned to 5720a38cfe)
Solutions
- Check limits: ulimit -u and systemd's TasksMax; raise them for the aphlict service user or unit
- Free headroom by stopping leaked processes, or reboot to clear PID exhaustion
- Run `bin/aphlict debug --client ... --admin ...` in the foreground (no fork) to confirm the failure is fork-specific, and consider a supervisor running it in foreground mode
Example fix
# before: pcntl_fork() fails under tight limits $ ulimit -u # raise limit (systemd): [Service] TasksMax=512 # after: bin/aphlict start forks successfully
Defensive patterns
Strategy: fallback
Validate before calling
// Pre-flight: can we fork at all?
$test = pcntl_fork();
if ($test < 0) {
throw new Exception('pcntl_fork unavailable: check ulimit -u / TasksMax');
}
if ($test === 0) { exit(0); } // child exits immediately
pcntl_waitpid($test, $status); Try / catch
try {
launch_daemonized($argv);
} catch (Exception $ex) {
if (preg_match('/fork/', $ex->getMessage())) {
// fallback: run in foreground under a supervisor instead
launch_foreground($argv);
}
} Prevention
- Size TasksMax/ulimit -u with headroom for the fork
- Run aphlict in --debug foreground mode under systemd/supervisord to sidestep daemonization entirely
When it happens
Trigger: Hitting RLIMIT_NPROC (per-user process limit) or system-wide PID exhaustion; forking denied by a container/seccomp policy that blocks clone(). Debug mode (--debug/--foreground) skips the fork and avoids the call.
Common situations: Shared hosts or cgroup-limited containers with tight ulimit -u; systemd service without TasksMax headroom; security-hardened containers blocking fork.
Related errors
- Unable to start notifications server because it is already r
- The notification server should not be run as root.
- Specify a user to notify with "--user".
- No user with username "%s" exists.
- Specify a message to send with "--message".
AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21).
Data as JSON: /api/errors/b3d05b892df4fc5c.
Report an issue: GitHub.