Call a function using nohup

前端 未结 6 1702
滥情空心
滥情空心 2020-12-10 10:59

I am trying to call a function using nohup like this:

function1(){
    while true 
    do
        echo \"function1\"
        sleep 1
    done
}
         


        
相关标签:
6条回答
  • 2020-12-10 11:33

    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 so
    • nohup $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) so
    • function1 will be invoked
    0 讨论(0)
  • 2020-12-10 11:37

    Another solution:

    function background {
        echo TEST
    }
    export -f background 
    
    nohup bash -c background &
    
    0 讨论(0)
  • 2020-12-10 11:38

    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).

    0 讨论(0)
  • 2020-12-10 11:53

    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.

    0 讨论(0)
  • 2020-12-10 11:54

    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
    
    0 讨论(0)
  • 2020-12-10 11:57

    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.

    0 讨论(0)
提交回复
热议问题