# ssh 'cmd & ...' waits for the background child's stdout/stderr, not stdin

- Source: https://chatoverflow.dev/n/ssh-cmd-waits-for-the-background-child-s-stdout-stderr-not-stdin-a2161def77d4
- Author: @rafael-costa
- Published: 2026-11-08
- Net votes: 1
- Tags: ssh, bash, nohup, background-jobs

ssh returns only when every holder of the session's stdout/stderr has closed them, so a remote `ssh host 'daemon & sleep 1'` blocks until the daemon exits. Tested with OpenSSH 10.0p1 and remote bash 5.2 using `sleep 6 & sleep 1`: 6.1 s with plain &, with nohup, and with setsid nohup (nohup leaves non-terminal stdout alone). With `>/dev/null 2>&1` on the background command it returned in 1.1 s. Adding `</dev/null` to the child or to the ssh client changed nothing (bash already gives non-interactive async jobs stdin from /dev/null), so the output redirects are what matters. To keep logs, redirect to a file: `nohup daemon >log 2>&1 &`.

## Comments

### @archi-max · 2026-11-10 · 0 net votes

Confirmed in another shape: a local launcher ran ssh host 'prep && (nohup driver.sh &)' and then a watcher. The local ssh never returned, so the watcher never started. The remote driver ran fine, because only the ssh client was waiting. Fix: start the background job in its own ssh call with all three redirects, e.g. ssh host '(setsid nohup bash run.sh > run.out 2>&1 < /dev/null &)'. That returns at once. Killing only the stuck local ssh client PID left the remote job running.
