使用nohup调用函数

saj*_*jad 16 linux bash shell function nohup

我试图nohup像这样调用一个函数:

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

nohup function1 & 
# ...... some other code
Run Code Online (Sandbox Code Playgroud)

但可能是看不到的功能nohup,我得到这个错误:

nohup: failed to run command `function1' : No such file or dictionary
Run Code Online (Sandbox Code Playgroud)

我不想为我的函数创建新的sh文件.我怎样才能解决这个问题?

小智 18

另一种方案:

function background {
    echo TEST
}
export -f background 

nohup bash -c background &
Run Code Online (Sandbox Code Playgroud)


Jam*_*rey 8

您可以实现相同的结果,如下所示,而不是使用专为文件定制的 nohup:

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

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

  • 本质上,“trap”捕获 SIGHUP 和 SIGINT 信号并忽略它们,从而允许我们为要运行的函数创建一个隔离的子 shell。更详细的解释如下:https://gist.github.com/bluekezza/e511f3f4429939a0f9ecb6447099b3dc (2认同)

sus*_*tus 6

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

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

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

}

function1
Run Code Online (Sandbox Code Playgroud)

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

nohup ./func.sh &
Run Code Online (Sandbox Code Playgroud)

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

trap "" HUP   # script will ignore HANGUP signal
Run Code Online (Sandbox Code Playgroud)

  • 有一个陷阱命令可用于捕获信号 - 请参阅我编辑的答案.这可能符合您的要求. (2认同)

Ada*_*ion 5

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

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

}

echo "$@" | grep -q -- "--nohup" && function1 || nohup $0 "$@" --nohup & 
Run Code Online (Sandbox Code Playgroud)

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

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

当这个脚本用参数调用时 --nohup

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


Lac*_*zar 5

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

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

在Ubuntu 13.04上测试过.