Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用nohup调用函数_Linux_Bash_Function_Shell_Nohup - Fatal编程技术网

Linux 使用nohup调用函数

Linux 使用nohup调用函数,linux,bash,function,shell,nohup,Linux,Bash,Function,Shell,Nohup,我尝试使用nohup调用函数,如下所示: function1(){ while true do echo "function1" sleep 1 done } nohup function1 & # ...... some other code (trap '' HUP INT while true do echo "function1" sleep 1 done ) </dev/null 2>

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

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

nohup function1 & 
# ...... some other code
(trap '' HUP INT
 while true
 do
   echo "function1"
   sleep 1
 done
) </dev/null 2>&1 1>nohup.out &
但是可能是函数没有被nohup看到,我得到了这个错误:

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

我不想为我的函数创建新的sh文件。如何修复此问题?

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

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

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

}

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

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


由于
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”
    将返回零状态(成功),因此
  • 将调用
    函数1

  • 是的!这是可能的,但是很棘手,并且严格地与bash>v2兼容:

    function1(){ local msg=${*:-function1}; echo msg=$msg; }
    nohup -- sh -c "$(typeset -f function1); function1 MESSAGE" >nohup.log 2>&1 0</dev/null &
    
    function1(){local msg=${*:-function1};echo msg=$msg;}
    
    nohup--sh-c“$(typeset-f function1);function1消息“>nohup.log 2>&10我找到了一个可行的解决方案-在文件中定义函数(例如
    .functions
    ),然后使用nohup运行函数:

    nohup bash-c“source.functions;function1”&

    在Ubuntu 13.04上测试。

    另一个解决方案:

    function background {
        echo TEST
    }
    export -f background 
    
    nohup bash -c background &
    

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

    function1(){
        while true 
        do
            echo "function1"
            sleep 1
        done
    }
    
    nohup function1 & 
    # ...... some other code
    
    (trap '' HUP INT
     while true
     do
       echo "function1"
       sleep 1
     done
    ) </dev/null 2>&1 1>nohup.out &
    
    (陷阱“”HUP INT
    虽然是真的
    做
    回声“功能1”
    睡眠1
    完成
    )&1>nohup.out&
    

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

    nohup需要一个文件作为参数(错误消息清楚地说明了这一点),而不是函数。但您可以做的是:修改上述脚本,使其接受一个新参数(例如“--nohup”),当传递此参数时,只需调用
    function1
    并将
    nohup function1&
    替换为
    nohup$0--nohup&
    在脚本中您的意思是我必须在函数中使用
    nohup
    ?我对调用函数的
    --nohup
    选项感到困惑!是否存在可能的重复,是否仍要在函数上应用nohup?我不喜欢使用几个sh文件。不,很遗憾。您可以做的是在一个脚本中保留常用函数,然后对其进行源代码生成;这将减少脚本计数。有一个trap命令可用于捕获信号-请参阅我编辑的答案。这可能符合你的要求。我不知道这个把戏。你能解释一下它是如何工作的吗?基本上,
    trap
    捕获SIGHUP和SIGINT信号并忽略它们,这样我们就可以创建一个独立的子shell来运行我们的函数。更详细的解释如下:如果你传入参数,不要忘记函数调用周围的引号:
    nohup bash-c'背景“您好”&
    如果您的func是
    echo“$1”
    export:-f:unknown option
    nohup bash-c”源代码。函数“arg1”&
    -->
    bash:.函数:没有这样的文件或目录
    ,即使函数在同一shell脚本中定义为函数