![bash 函数在作业完成后发送电子邮件](https://linux22.com/image/107667/bash%20%E5%87%BD%E6%95%B0%E5%9C%A8%E4%BD%9C%E4%B8%9A%E5%AE%8C%E6%88%90%E5%90%8E%E5%8F%91%E9%80%81%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6.png)
我在 bashrc 中编写了以下函数。它每 5 秒检查一次作业是否正在运行,并在作业完成时发送电子邮件。
function jobcheck () {
time=`date`
jobstatus=`jobs $1`
while [ 1 ]; do
if (( ! `echo $jobstatus | grep "Running" | wc -l` )); then
"sendEmail command to send email"
break;
fi
sleep 5;
done
}
我想按如下方式调用此函数(对于作业编号 2,例如)
jobcheck 2
并继续在命令行上运行其他命令。但 while 循环继续运行,我没有得到命令提示符。
如果我运行它
jobcheck 2 &
然后它给出错误bash: jobs 2 not found
如何在后台运行此功能?
答案1
您必须重写您的函数才能做到这一点。
当您使用 启动后台作业时&
,shell 确实会跟踪该作业,并且您确实可以通过使用jobs
内置函数来找出更多信息。然而,该信息特定于那个实例壳的;如果您自行运行函数&
,则会生成一个单独的 shell,该 shell 不是具有后台作业的 shell,因此您无法从该单独的 shell 访问有关原始 shell 作业的信息。
然而,有一个简单的方法可以解决这个问题:
- 重写您的函数,使其根据进程 ID (PID) 而不是作业号运行。也就是说,让它检查进程是否仍然存在(例如,通过解析
ps
输出,或者检查是否/proc/pid
存在) %2
使用而不是2
作为参数运行您的新函数。也就是说,给它百分号,后面加上你想要监控的作业ID; Bourne shell 使用百分号将作业 id 替换为给定作业的 pid。
有了这个,它应该就可以工作了。