I am trying to call a function using nohup
like this:
function1(){
while true
do
echo \"function1\"
sleep 1
done
}
Since nohup
must be supplied with a filename not a function as a workaround this is what can be done:
function1(){
while true
do
echo "function1"
sleep 1
done
}
echo "$@" | grep -q -- "--nohup" && function1 || nohup $0 "$@" --nohup &
So when this script gets called with the current arguments:
`echo "$@" | grep -q -- "--nohup"
will return an error status sonohup $0 "$@" --nohup &
will be invoked, which will invoke this script passing the current arguments and a new argument --nohup
And when this script is called with argument --nohup
`echo "$@" | grep -q -- "--nohup"
will return with zero status (success) sofunction1
will be invokedAnother solution:
function background {
echo TEST
}
export -f background
nohup bash -c background &
Yes ! It is possible however tricky, and strictly bash > v2 compatible :
function1(){ local msg=${*:-function1}; echo msg=$msg; }
nohup -- sh -c "$(typeset -f function1); function1 MESSAGE" >nohup.log 2>&1 0</dev/null &
And don't forget "typeset" is bash deprecated in favor of "declare" (though I don't entirely agree with this).
I find a working solution for me - define the function in a file (e.g. .functions
) then run the function with nohup:
nohup bash -c "source .functions; function1" &
Tested on Ubuntu 13.04.
nohup
applies to commands and not to script functions.
For example, the script (say func.sh) that contains function1() should call the function-:
function1(){
while true
do
echo "function1"
sleep 1
done
}
function1
Now call the script func.sh with nohup
in the background-:
nohup ./func.sh &
If you need to disable the hangup signal from within the script use the shell built-in trap
. The example ignores SIGHUP but can be used to ignore others (e.g. SIGINT).
trap "" HUP # script will ignore HANGUP signal
Instead of using nohup, which is tailored for files, you can implement the same result like this:
(trap '' HUP INT
while true
do
echo "function1"
sleep 1
done
) </dev/null 2>&1 1>nohup.out &
As I tend to launch these processes from a parent script and the parent script may do other work if the parent process is interrupted I want the child process to ignore the INT signal and keep on running.