bash nohup有两个命令

skd*_*skd 6 bash sh nohup

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

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

    (nohup $rest &> $last < /dev/null; mail -s "$rest" "$email" < "$last") &
}
Run Code Online (Sandbox Code Playgroud)

该功能就像这样使用

run ./script.sh arg1 arg2 output
Run Code Online (Sandbox Code Playgroud)

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

twa*_*erg 8

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

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

  nohup bash -c "$rest < /dev/null 2>&1 | mail -s \"$rest\" \"$email\"" &
}
Run Code Online (Sandbox Code Playgroud)

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