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
如何在後台執行此功能?
你必須重寫你的函式才能做到這一點。
當您使用 啟動後台作業時
&
,shell 確實會跟踪它,並且您確實可以使用jobs
內置命令找出更多資訊。但是,該資訊特定於該 shell實例;如果您自己執行您的函式&
,則會生成一個單獨的 shell,它不是具有後台作業的 shell,因此您無法從該單獨的 shell 訪問有關原始 shell 作業的資訊。但是,有一個簡單的方法可以解決這個問題:
- 重寫您的函式,使其根據程序 ID (PID) 而不是作業編號執行。也就是說,讓它檢查一個程序是否仍然存在(例如,通過解析
ps
輸出,或通過檢查是否/proc/pid
存在)%2
使用而不是2
作為參數執行您的新函式。也就是說,給它一個百分號,後跟你要監控的工作ID;Bourne shell 使用百分號將作業 id 替換為給定作業的 pid。有了這個,它應該可以工作。