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
将返回零状态(成功),因此`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脚本中定义为函数