我正在尝试使用nohup来调用一个函数,例如:
function1(){ while true do echo "function1" sleep 1 done } nohup function1 & # ...... some other code
但是也许这个function并没有被nohup所看到,我在这个前提中看到了这个信息:
nohup:未能运行命令`function1':没有这样的文件或字典
我不想为我的函数创build新的sh文件。 我怎样才能解决这个问题? 谢谢。
另一个方案
function background { echo TEST } export -f background nohup bash -c background &
nohup
适用于命令而不是脚本功能。
例如,包含function1()的脚本(比如说func.sh)应该调用函数:
function1(){ while true do echo "function1" sleep 1 done } function1
现在在后台用nohup
调用脚本func.sh:
nohup ./func.sh &
如果您需要禁用脚本中的挂断信号,请使用shell内置trap
。 该示例忽略SIGHUP,但可以用来忽略其他(例如SIGINT)。
trap "" HUP # script will ignore HANGUP signal
由于nohup
必须提供一个文件名,而不是函数作为一个解决方法,这是可以做到的:
function1(){ while true do echo "function1" sleep 1 done } echo "$@" | grep -q -- "--nohup" && function1 || nohup $0 "$@" --nohup &
所以当这个脚本被当前参数调用时:
`echo "$@" | grep -q -- "--nohup"
`echo "$@" | grep -q -- "--nohup"
将会返回错误状态 nohup $0 "$@" --nohup &
将会被调用,它会调用这个脚本传递当前的参数和一个新的参数--nohup
当这个脚本被调用参数--nohup
`echo "$@" | grep -q -- "--nohup"
`echo "$@" | grep -q -- "--nohup"
将以零状态(成功)返回 function1
将被调用 我找到了一个适用于我的工作解决方案 – 在一个文件中定义函数(例如.functions
),然后用nohup运行函数:
nohup bash -c "source .functions; function1" &
在Ubuntu 13.04上测试
是的! 这是可能的,但棘手,严格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弃用“声明”(虽然我不完全同意这一点)。