使用nohup调用函数

时间:2013-05-08 08:07:42

标签: linux bash function shell nohup

我试图使用nohup调用函数,如下所示:

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

nohup function1 & 
# ...... some other code

nohup可能看不到该功能,我收到此错误:

nohup: failed to run command `function1' : No such file or dictionary

我不想为我的函数创建新的sh文件。我该如何解决这个问题?

6 个答案:

答案 0 :(得分:14)

另一种解决方案:

function background {
    echo TEST
}
export -f background 

nohup bash -c background &

答案 1 :(得分:6)

nohup适用于命令而不适用于脚本函数。

例如,包含function1()的脚本(比如func.sh)应该调用函数 - :

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

}

function1

现在在后台调用带有nohup的脚本func.sh - :

nohup ./func.sh &

如果您需要从脚本中禁用挂断信号,请使用内置的trap shell。该示例忽略了SIGHUP,但可以用来忽略其他(例如SIGINT)。

trap "" HUP   # script will ignore HANGUP signal

答案 2 :(得分:5)

我为我找到了一个有用的解决方案 - 在文件中定义函数(例如.functions)然后用nohup运行函数:

nohup bash -c "source .functions; function1" &

在Ubuntu 13.04上测试。

答案 3 :(得分:4)

由于nohup必须提供文件名而不是函数作为解决方法,因此可以做到这一点:

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

}

echo "$@" | grep -q -- "--nohup" && function1 || nohup $0 "$@" --nohup & 

因此,当使用当前参数调用此脚本时:

  • `echo "$@" | grep -q -- "--nohup"将返回错误状态,以便
  • 将调用
  • nohup $0 "$@" --nohup &,它将调用此脚本传递当前参数和新参数--nohup

使用参数--nohup

调用此脚本时
  • `echo "$@" | grep -q -- "--nohup"将返回零状态(成功),所以
  • function1将被调用

答案 4 :(得分:2)

是的!然而,它可能是棘手的,并严格地打击> v2兼容:

function1(){ local msg=${*:-function1}; echo msg=$msg; }
nohup -- sh -c "$(typeset -f function1); function1 MESSAGE" >nohup.log 2>&1 0</dev/null &

不要忘记“排版”是bash弃用赞成“声明”(虽然我不完全同意这一点)。

答案 5 :(得分:0)

代替使用为文件量身定制的nohup,您可以实现以下相同的结果:

(trap '' HUP INT
 while true
 do
   echo "function1"
   sleep 1
 done
) </dev/null 2>&1 1>nohup.out &

由于我倾向于从父脚本启动这些进程,并且如果父进程中断,则父脚本可能会执行其他工作,因此我希望子进程忽略INT信号并继续运行。