我的 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/