我的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
脚本仍在运行,但它最后不会发送电子邮件。我真的很感激一些指示,以使其正常工作。
答案 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
,但如果您已经在其他代码中调用了它,那么保留该位可能更简单在 - 你必须弄清楚那部分......