bash 函数在作业完成后发送电子邮件

bash 函数在作业完成后发送电子邮件

我在 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。

有了这个,它应该就可以工作了。

相关内容