我的函数很小,bashrc
所以我可以运行一个脚本,并在输出完成后将输出发送到我的电子邮件中。代码如下:
run() {
[email protected]
last="${!#}"
rest="${@:1:($#-1)}"
(nohup $rest &> $last < /dev/null; mail -s "$rest" "$email" < "$last") &
}
该功能是这样使用的
run ./script.sh arg1 arg2 output
而且似乎在大多数时间都可以正常工作,但是有时即使脚本完成,电子邮件也无法发送。我怀疑这与我关闭服务器终端有关。在这些情况下,由于导致脚本仍在运行,nohup
但最终不会发送电子邮件。为了使它正常工作,我非常感谢一些指导。
有多种解决方法,但是我认为我建议这样做:
run() {
[email protected]
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
,但是如果您已经对它的调用散布在其他代码中,那么将其留在其中可能会更简单-您必须弄清楚那一部分...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句