bash nohup有两个命令

时间:2014-02-10 15:02:05

标签: bash sh nohup

我的bashrc中有一个小功能,所以我可以运行一个脚本,并在完成后将输出发送到我的电子邮件。代码如下:

run() {
    email=example@gmail.com
    last="${!#}"
    rest="${@:1:($#-1)}"

    (nohup $rest &> $last < /dev/null; mail -s "$rest" "$email" < "$last") &
}

该功能就像这样使用

run ./script.sh arg1 arg2 output

它似乎大部分时间都在工作,但有时即使脚本完成,电子邮件也不会被发送。我怀疑它与关闭服务器终端有关。在这些情况下,由于nohup脚本仍在运行,但它最后不会发送电子邮件。我真的很感激一些指示,以使其正常工作。

1 个答案:

答案 0 :(得分:8)

有多种方法可以解决这个问题,但我想我会建议:

run() {
  email=example@gmail.com
  rest="${@:1:($#-1)}"

  nohup bash -c "$rest < /dev/null 2>&1 | mail -s \"$rest\" \"$email\"" &
}

问题是您的nohup命令在/dev/null之后以分号结束,因此不适用于mail部分。 ( ... )引入了子shell,但不是外部命令,因此nohup ( ... )不起作用,这就是为什么bash -c "..."是必需的(您还可以使用${SHELL} -c " ..."添加如果这很重要,可移植性)。当您用另一组引号括起来时,您需要转义双引号。此外,临时文件不是必需的(除非您出于某种原因想要保留它 - 如果是这种情况,请随意将重定向放回原点,并将命令与;分开,而不是|) 。在不需要输出文件的情况下,您也可以省略rest=...位并将其称为run script.sh arg1 arg2,但如果您已经在其他代码中调用了它,那么保留该位可能更简单在 - 你必须弄清楚那部分......