Linux shell脚本:通过nohup调用一个函数

我正在尝试使用nohup来调用一个函数,例如:

function1(){ while true do echo "function1" sleep 1 done } nohup function1 & # ...... some other code 

但是也许这个function并没有被nohup所看到,我在这个前提中看到了这个信息:

nohup:未能运行命令`function1':没有这样的文件或字典

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

Solutions Collecting From Web of "Linux shell脚本:通过nohup调用一个函数"

另一个方案

 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弃用“声明”(虽然我不完全同意这一点)。