我的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
,但是如果您已经将对该位的调用分布在其他代码中,那么保留该位可能会更简单 - 您必须弄清楚那部分......