[工作效率][Linux] 指令完成寄信通知我,讓我先去看劇?

有些再簡單不過的指令像是 mv, cp, rm 遇到檔案一多的時候有時候可以跑好幾分鐘,甚至一小時以上。我也不曉得他什麼時候會跑完,30 秒? 10 分鐘? 2小時? 都有可能。

手邊也暫時沒其他工作可以平行進行的話,也只能放著讓他跑。

但時不時就會好奇他跑完了沒,一直來回切換視窗,或是去忙別的事卻一直跑回房間看螢幕。這時候我們就會很想要讓他跑完時通知我們。

Sequential Commands

最簡單的方法就是與其執行一個指令,不如執行 multiple commands,讓前面指令跑完就跑通知用的指令,我們這邊以 sleep 當作一個跑很久的指令:


sleep 10; notify_me

要注意的是這裡最好用 ; 把指令串起來,最好不要用 &&,因為 && 一定要前面的指令成功 (return zero exit code),後面的指令才會執行,我們最好別太把握前面的指令跑到一半一定會不會發生錯誤。

通知的媒介

至於通知的指令要用哪種方式,我就有試過以下的方式:

  1. 播放聲音通知
  2. 在 VNC 視窗傳送通知到 VNC 桌面 (e.g., notify-send)
  3. 用第三方工具傳送通知 (e.g., Slack, Teams)
  4. 寄送 email 通知

但實際用過之後才發現一些缺點。聲音很容易因為人不在房間就沒聽到;VNC 視窗傳送就限制你只能在 VNC 視窗跑指令,而且人沒盯著螢幕也很容易錯過;第三方工具看起來最棒,但有時因為第三方工具或網路不穩就是會沒送到通知。

寄信+手機 app 還是最可靠

最可靠的還是透過簡單的指令像是 mail, sendmail, mutt 等工具來寄信。不過 IT 要先設定好信箱,但公司通常都會有。

於是我們就可以在 .bashrc 寫一個 function,例如我們可以使用 mutt 來當作寄信的工具:


# Send an email with only the subject
#
# Examples:
# mail2me
# mail2me "Command finished"
function mail2me() {
    local -r subject="$1"
    mutt -s "${subject}" "username@company.com" < /dev/null
}


這麼一來我們要跑很久的指令就變成:


sleep 10; mail2me "sleep finished"


只要在手機上裝信箱 app 像是 Outlook,指令完成你就會收到一封只有標題的信,標題就是 mail2me 後面的第一個參數。看到寄信再回去房間繼續工作就好了。

這方法只有一個缺陷:劇太好看就會忘記看手機。

設定讓 mutt 不要送一封信就建立 ~/send

在家目錄建一個 ~/.muttrc 裡面加上一行就可以不要讓他每送一封信就建 ~/send 檔案:


# Don't save a copy of outgoing messages in ~/send
set copy=no

其他有趣的設定可以在 muttrc man page 或這個 muttrc 範例參考。

實務應用

最近在用 Python 寫一個 benchmark program 測試不同的 machines 上的各式讀寫速度,因為要跑24小時,但如果途中遇到錯誤會立刻結束。

如果我想要即時知道有錯誤發生,趕快重跑的話,就可以使用 mail2me,配合 $(hostname) 可以知道是結束在哪一台 machine 上:


./run_benchmark.py; mail2me "benchmark finished on $(hostname)"

同一個指令就可以撒下去給好幾十台 machines 同時奔跑。

留言

此網誌的熱門文章

[試算表] 追蹤台股 Google Spreadsheet (未實現損益/已實現損益)

[Side Project] 互動式教學神經網路反向傳播 Interactive Computational Graph

[插件] 在 Chrome 網頁做區分大小寫的搜尋