disown -h are not exactly the same thing.
disown, a process is removed from the list of jobs in the current interactive shell. Running
jobs after starting a background process and running
disown will not show that process as a job in the shell. A disowned job will not receive a
HUP from the shell when it exits (but see note at end).
disown -h, the job is not removed from the list of jobs, but the shell would not send a
HUP signal to it if it exited (but see note at end).
nohup utility ignores the
HUP signal and starts the given utility. The utility inherits the signal mask from
nohup and will therefore also ignore the
HUP signal. When the shell terminates, the process remains as a child process of
nohup is re-parented to
The difference is that the process started with
HUP regardless of who sends the signal. The disowned processes are just not sent a
HUP signal by the shell, but may still be sent the signal from e.g.
kill -s HUP <pid> and will not ignore this.
HUP is only sent to the jobs of a shell if
- the shell is a login shell and the
huponexit shell option is set, or
- the shell itself recieves a
Relevant bits from the
bash manual (my emphasis):
The shell exits by default upon receipt of a
SIGHUP. Before exiting,
an interactive shell resends the
SIGHUP to all jobs, running or
stopped. Stopped jobs are sent
SIGCONT to ensure that they receive the
SIGHUP. To prevent the shell from sending the signal to a particular
job, it should be removed from the jobs table with the
SHELL BUILTIN COMMANDS below) or marked to not receive
huponexit shell option has been set with
bash sends a
SIGHUP to all jobs when an interactive login shell exits.
disown [-ar] [-h] [jobspec ... | pid ... ]
Without options, remove each
jobspec from the table of active
jobs. [...] If the
is given, each
jobspec is not removed from the table, but is
marked so that
SIGHUP is not sent to the job if the shell