bash nohup 有两个命令

标签 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,脚本仍在运行,但它不会在最后发送电子邮件。为了让它正常工作,我真的很感激一些指示。

最佳答案

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

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,但如果您已经调用让它传播到其他代码中,将那一点留在里面可能更简单 - 你必须弄清楚那部分......

关于bash nohup 有两个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21680561/

相关文章:

json - 指向文件的硬链接(hard link)在 OS X 上未按预期工作

bash - 返回命令的 pid 而不是返回 tee pid

linux - 如何避免创建 nohup.out 以及在这种情况下将生成输出的位置?

linux - 为什么 tcpdump 不在后台运行?

string - 两个字符串之间的 ASCII 差异

linux - bash 基于 ip 列表运行命令

linux - 生成字符串,此字符串的 SHA256 前两个字节等于 0

linux - 为什么我不能在 cron 上安排工作?

shell - "netcat -e"执行脚本后重置连接

Python - nohup.out 不显示打印语句