Bash

作業完成後發送電子郵件的 bash 功能

  • March 16, 2017

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

如何在後台執行此功能?

你必須重寫你的函式才能做到這一點。

當您使用 啟動後台作業時&,shell 確實會跟踪它,並且您確實可以使用jobs內置命令找出更多資訊。但是,該資訊特定於該 shell實例;如果您自己執行您的函式&,則會生成一個單獨的 shell,它不是具有後台作業的 shell,因此您無法從該單獨的 shell 訪問有關原始 shell 作業的資訊。

但是,有一個簡單的方法可以解決這個問題:

  • 重寫您的函式,使其根據程序 ID (PID) 而不是作業編號執行。也就是說,讓它檢查一個程序是否仍然存在(例如,通過解析ps輸出,或通過檢查是否/proc/pid存在)
  • %2使用而不是2作為參數執行您的新函式。也就是說,給它一個百分號,後跟你要監控的工作ID;Bourne shell 使用百分號將作業 id 替換為給定作業的 pid。

有了這個,它應該可以工作。

引用自:https://unix.stackexchange.com/questions/351778