22

我正在尝试使用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 文件。我怎样才能解决这个问题?

4

6 回答 6

29

另一种解决方案:

function background {
    echo TEST
}
export -f background 

nohup bash -c background &
于 2017-04-04T09:08:07.830 回答
7

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

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

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

}

function1

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

nohup ./func.sh &

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

trap "" HUP   # script will ignore HANGUP signal
于 2013-05-08T08:14:46.200 回答
7

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

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

在 Ubuntu 13.04 上测试。

于 2014-05-26T20:19:13.213 回答
5

由于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将被调用
于 2013-05-08T08:47:16.057 回答
4

您可以像这样实现相同的结果,而不是使用为文件量身定制的 nohup:

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

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

于 2019-02-14T10:52:03.080 回答
3

是的 !然而,它可能很棘手,并且严格 bash > v2 兼容:

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

并且不要忘记“排版”已被 bash 弃用,取而代之的是“声明”(尽管我并不完全同意这一点)。

于 2013-08-03T17:38:41.853 回答