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)
您可以实现相同的结果,如下所示,而不是使用专为文件定制的 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 信号并继续运行。
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)
由于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
将被调用我找到了一个有效的解决方案 - 在文件中定义函数(例如.functions
)然后用nohup运行函数:
nohup bash -c "source .functions; function1" &
在Ubuntu 13.04上测试过.
归档时间: |
|
查看次数: |
20326 次 |
最近记录: |