Linux – Run a part of script shell in nohup

bashlinuxshell

How can run a part of a shell script in nohup mode ? My script goes like this:

#!/bin/bash

command_1
script2.sh
script3.sh
...
(tests & loops, etc)
script4.sh
script5.sh

and what I would like is to run the part from script3.sh to script5.sh in nohup mode without using the command 'nohup' or '&' so if the user get disconnected, the script execution continues.

Dont' know if my question is clear enough 🙂
Thank you!

Best Answer

The primary purpose of nohup is to insulate programs from the HUP signal, typically received when the controlling TTY is disconnected (e.g., because of the user logging out).

You can accomplish the same thing using the shell builtin command trap:

$ help trap
Trap signals and other events.

Defines and activates handlers to be run when the shell receives signals
or other conditions.

ARG is a command to be read and executed when the shell receives the
signal(s) SIGNAL_SPEC.  If ARG is absent (and a single SIGNAL_SPEC
is supplied) or `-', each specified signal is reset to its original
value.  If ARG is the null string each SIGNAL_SPEC is ignored by the
shell and by the commands it invokes.

So you can use the trap command to insulate portions of your script from the HUP signal by passing a null string as the action. For example:

#!/bin/sh

command_1
script2.sh

# Starting ignoring HUP signal
trap "" HUP

script3.sh
...
(tests & loops, etc)
script4.sh

# Resume normal HUP handling.
trap - HUP

script5.sh

You will probably want to ensure that output to your script is being directed to a file (otherwise you will lose any output after you disconnect, even if the script keeps running).

You might also want to consider simply running the script under control of screen, since this has the advantage that you can re-attach to the running script after getting disconnected.