Jobが終わったらメールちょうだい

時間のかかる解析が終わったらメールを自動で送られてくるようにしたい。そんなときにやってみた諸々設定の備忘録。コンピューター上にメールサーバを建てずともGmail様の力を借りてできます。
共用PCならメールシステムを共用部に設定すれば、各ユーザーが好きな受取先でメールを受け取れます。

送信元として使うGmailの準備

まず送信元にするGmailアカウントを作成しましょう。(ラボの共用PCならあなたのプライベートアカウントは使わないほうがいいです。)

アプリパスワードを取得する https://security.google.com/settings/security/apppasswords
テキトウなアプリ名を設定してパスワードをもらう。必ずメモる!!

メールシステム(msmtp)の設定

ここでは管理者権限を持っている人が、コンピューターの根っこにmsmtpを設定することを想定しています。

インストール

sudo apt install msmtp msmtp-mta
Bash

Gmailと紐づけ設定

cd /etc
touch msmtprc
nano msmtprc
## 以下を編集してコピペ
Bash
> msmtprc
defaults
port 587
tls on
tls_trust_file /etc/ssl/certs/ca-bundle.crt

# Gmail
account gmail
host smtp.gmail.com
from hogehoge@gmail.com
## ↑送信元のアドレス
auth on
user hogehoge@gmail.com
## ↑送信元のアドレス
password abcdabcdabcdabcd
## ↑さっき取得したアプリパスワード(ハイフンいらん)

# Set a default account
account default : gmail
Bash

テスト

echo "Dekita!" | msmtp [あなたのアドレス]
Bash

これが無事に届けば成功です。

Jobが終わったらメールくるようにする

例)gzip hogehoge.gz が終わったら「gzip hogehoge.gz done!」とメールがほしい

cmd="gzip hogehoge.gz";nohup $cmd && (echo  $cmd done! | msmtp your@mail) > ./cmd &
Bash

例)gzip hogehoge.gz が終わったらちょっと凝ったメールがほしい

> test.mail
From:Hogehoge
Subject:Job done

Job ga owattawayo
Bash
cmd="gzip hogehoge.gz";nohup $cmd && (cat test.mail | msmtp your@mail) > ./cmd &
Bash

ディスクがいっぱいになったら通知くるようにしてみる

ディスク容量が90%超えたらメールが送られてくるようにしてみる。1時間ごとに監視して、一度通知を送ったら24時間は再通知を送らないようにしてみる。

監視用スクリプトの設定

cd /etc
touch monitor.sh
nano monitor.sh
## 以下を編集してコピペ
Bash
> monitor.sh
#!/bin/sh
#monitor.sh

To=[あなたのアドレス]

# Disk
MAX_SPACE=90

## Read Disk Timestamp file
TIMESTAMP_FILE="/tmp/monitoring_disc_last_alert.timestamp"

## Check if 24 hours have passed since the last alert
send_alert=true
if [ -f "$TIMESTAMP_FILE" ]; then
    last_alert=$(cat $TIMESTAMP_FILE)
    current_time=$(date +%s)
    if [ $(($current_time - $last_alert)) -lt 86400 ]; then
        send_alert=false
    fi
fi

## Check Disk
if $send_alert; then
    USAGE=$(df -h | grep '/dev/sda3' | awk '{print $5}' | sed 's/%//g')
    ALL=$(df -h | grep '/dev/sda3' | awk '{print $2}')
    USED=$(df -h | grep '/dev/sda3' | awk '{print $3}')
    if [ $USAGE -gt $MAX_SPACE ]; then
        echo -e "Subject: Disk Space Alert on $(hostname)\n\nDisk space running low \non $(hostname) at $(date):\n${USAGE}% ($USED/$ALL)" | msmtp $To
        date +%s > $TIMESTAMP_FILE
        send_alert=false
    fi
fi
Bash

定期的に実行

1時間毎に上のスクリプトを実行する

sudo crontab -e
# 以下をコピペ
0 */1 * * * bash /etc/monitor.shBash
Bash

コメント