2023-01-09

Linux Mint に cron 処理を登録してみた

Thunderbird のアーカイブしたメールボックスをバックアップする必要があり、手動でも良いのですがせっかくなので cron での自動処理に挑戦してみました。

メールサーバー上からアーカイブしたメールを Thunderbird の「ローカルフォルダー」という場所に保管するようにしてみました。アーカイブするとメールサーバー上からはなくなり、この PC のディスク上にしかメールが残らなくなるので、ディスク障害が起こってしまった場合にはメールがなくなってしまうことになります。

そんなことが起きても困らないように Linux の rsync コマンドで定期的にバックアップを取得しよう、というわけです。

 

構成

Thunderbird の「ローカルフォルダー」のディスクには PC 上の SSD を割り当てています。これを同じ PC 上の HDD に適当なタイミングで rsync コマンドを使って差分バックアップをしたい、ということになります。

その後に HDD から NAS(うちにある QNAP とか)にまでコピーできれば完璧ですね。 


準備

まずは定期的に実行したい rsync コマンドを準備して練習実行してみます。

rsync -auv --delete ~/.var/app/org.mozilla.Thunderbird/.thunderbird/ /mnt/DATA/Thunderbird/

rsync コマンドのオプションは以下の通りです。

-a お決まりで付けた方が良い。
-v 処理結果を表示してくれる。
-u 追加、更新されたものだけコピーする。
--delete コピー元で削除されたものをコピー先でも削除する。

 

定期実行の組み込み

今回は crontab を使ってみます。最初に現状の確認です。

$ crontab -l
no crontab for xxxxxxxx

準備しておいた rsync コマンドのシェルスクリプトを /usr/bin にコピーします。cron で実行される時の PATH の範囲で探せる場所、ということで /usr/bin を選びました。

コピー前にシェルスクリプトのファイルに実行可能属性を付与しておくことを忘れずに。(chmod +x 〜)

今回はファイル名を「mrr-thunderbird.sh」としています。

$ ll mrr* 
-rwxrwxr-x 1 xxxxxxxx xxxxxxxx 93  1月  7 16:07 mrr-thunderbird.sh*

$ sudo cp mrr-thunderbird.sh /usr/bin

では、crontab にスケジュール情報を追加します。

$ crontab -e
no crontab for xxxxxxxx - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        ---- easiest
  2. /usr/bin/vim.tiny
  3. /bin/ed

Choose 1-3 [1]: 1

なかなか難しいです。

「編集するためのエディターを選べ」と言ってきます。「nano が一番とっつきやすいよ」ということなので、1番の nano を選択してみました。 

すると CUI のエディターが起動しました。

  GNU nano 6.2                                   /tmp/crontab.hAv0bD/crontab *                                          
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
*/30 * * * * mrr-thunderbird.sh 








書き込むファイル: /tmp/crontab.hAv0bD/crontab                                                                           
^G ヘルプ                     M-D DOS フォーマット          M-A 末尾に追加                M-B バックアップファイル
^C 取消                       M-M Mac フォーマット          M-P 先頭に追加                ^T ファイル一覧

CUI エディターなんて久しぶりですわ。30分ごとに実行されるように記述してみました。

ファイルへの保存は Ctrl + O キーです。そうすると「書き込むファイル」というのが表示されるので、続けて Enter キーで保存されます。最後に Ctrl + X キーで nano が終了します。 

ていうか、ファイルが /tmp に保存されるのですね。ワタシの Linux Mint は /tmp を tmpfs にしているので、PC を再起動するとこの crontab に設定した内容は忘れ去られてしまうのでしょうか?

まあ、ひとまずこのまま進めてみましょう。

編集後の crontab の内容を確認してみます。

$ crontab -l
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
*/30 * * * * mrr-thunderbird.sh

確かに先ほど保存した内容が表示されます。

では、時間が経過するのをじっと待ってから cron による定期実行の結果を確認してみます。

$ journalctl -b 0 -S "2023-01-07 16:30:00" | grep CRON

 1月 07 16:30:01 xxxxxx CRON[42662]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
 1月 07 16:30:01 xxxxxx CRON[42664]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /us>
 1月 07 16:30:01 xxxxxx CRON[42663]: pam_unix(cron:session): session opened for user xxxxxxxx(uid=1000) by (uid=0)
 1月 07 16:30:01 xxxxxx CRON[42665]: (xxxxxxxx) CMD (mrr-thunderbird.sh)
 1月 07 16:30:01 xxxxxx CRON[42662]: pam_unix(cron:session): session closed for user root
 1月 07 16:30:02 xxxxxx CRON[42663]: (CRON) info (No MTA installed, discarding output)
 1月 07 16:30:02 xxxxxx CRON[42663]: pam_unix(cron:session): session closed for user xxxxxxxx

ん〜、シェルスクリプト名が表示されているので実行されたのかな?

「No MTA installed 〜」 って何でしょう?

調べてみると cron で実行された結果をメールで送信する仕様のようですね。Postfix をインストールすると良いようです。
※これは後述の方法で不要となりました。

$apt install postfix

パッケージの設定


                   ┌───────────────────────────┤ Postfix Configuration ├───────────────────────────┐
                   │ Please select the mail server configuration type that best meets your needs.  │ 
                   │                                                                               │ 
                   │  No configuration:                                                            │ 
                   │   Should be chosen to leave the current configuration unchanged.              │ 
                   │  Internet site:                                                               │ 
                   │   Mail is sent and received directly using SMTP.                              │ 
                   │  Internet with smarthost:                                                     │ 
                   │   Mail is received directly using SMTP or by running a utility such           │ 
                   │   as fetchmail. Outgoing mail is sent using a smarthost.                      │ 
                   │  Satellite system:                                                            │ 
                   │   All mail is sent to another machine, called a 'smarthost', for              │ 
                   │   delivery.                                                                   │ 
                   │  Local only:                                                                  │ 
                   │   The only delivered mail is the mail for local users. There is no            │ 
                   │   network.                                                                    │ 
                   │                                                                               │ 
                   │ General mail configuration type:                                              │ 
                   │                                                                               │ 
                   │                       設定なし                                                │ 
                   │                       インターネットサイト                                    │ 
                   │                       スマートホスト付きインターネット                        │ 
                   │                       サテライトシステム                                      │ 
                   │                       ローカルのみ                                            │ 
                   │                                                                               │ 
                   │                                                                               │ 
                   │                     <了解>                       <取消>                       │ 
                   │                                                                               │ 
                   └───────────────────────────────────────────────────────────────────────────────┘ 

また CUI な画面ですが、Postfix の設定方法として「ローカルのみ」を選択すれば良いようです。メールボックス?のユーザー名などを何度か聞かれますが、だいたい自分のユーザー名を入力してみました。

Postfix のインストール後に cron 処理が動いたところでメールボックスにメールが届きました。/var/mail 配下に Postfix インストール時に指定したユーザー名のファイルが 1つだけ作成されていました。

$ ll -h
合計 16K
drwxrwsr-x  2 root      mail 4.0K  1月  7 20:30 ./
drwxr-xr-x 11 root      root 4.0K 12月  4 02:06 ../
-rw-------  1 xxxxxxxx  mail 4.9K  1月  7 20:30 xxxxxxxx

メールの中身を見てみましょう。

$ cat xxxxxxxx
 
From xxxxxxxx@xxxxxx.flets-east.jp  Sat Jan  7 19:45:02 2023
Return-Path: xxxxxxxx@xxxxxx.flets-east.jp
X-Original-To: xxxxxxxx
Delivered-To: xxxxxxxx@xxxxxx.flets-east.jp
Received: by xxxxxx.flets-east.jp (Postfix, from userid 1000)
	id 0D1A4CA22D; Sat,  7 Jan 2023 19:45:02 +0900 (JST)
From: root@xxxxxx.flets-east.jp (Cron Daemon)
To: xxxxxxxx@xxxxxx.flets-east.jp
Subject: Cron xxxxxxxx@xxxxxx mrr-thunderbird.sh
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Cron-Env: SHELL=/bin/sh
X-Cron-Env: HOME=/home/xxxxxxxx
X-Cron-Env: LOGNAME=xxxxxxxx
Message-Id: 20230107104502.0D1A4CA22D@xxxxxx.flets-east.jp
Date: Sat,  7 Jan 2023 19:45:02 +0900 (JST)

sending incremental file list
yyyyyyyy.default-default/
yyyyyyyy.default-default/folderCache.json
yyyyyyyy.default-default/prefs.js
yyyyyyyy.default-default/ImapMail/imap.mail.yahoo.co.jp/INBOX.msf
yyyyyyyy.default-default/datareporting/
yyyyyyyy.default-default/datareporting/aborted-session-ping

sent 12,154,267 bytes  received 263 bytes  24,309,060.00 bytes/sec
total size is 713,317,993  speedup is 58.69

ほぉ。rsync コマンドは無事に動いているようです。cron で動く時の $HOME 変数の内容も確認できました。いつもと同じようです。

cron の定期処理が動くたびにこのメールファイルにログ情報が追記されて行くようなので、たまに削除するなり、メンテナンスが必要ですね。

 

改良

それにしても、cron の実行結果を確認するためだけに Postfix を動かさなければならないのはなんとかならないんですかね。

ということで、そっちの視点で調べてみるとやはり方法がありました。crontab に登録する実行コマンドを工夫する、という方法です。

*/15 * * * * $HOME/mrr-thunderbird.sh >> $HOME/.log/mrr-thunderbird.log

試してみると期待通りに動作したので、先ほどインストールした Postfix はアンインストールしてしまいました。

ちょっとテストのサイクルを短縮するために cron の設定も 15分間隔に短縮しています。また、シェルスクリプトの置き場も $HOME 変数が効くのがわかったので、/usr/bin から /home に移動してみました。

cron でシェルスクリプトが動くたびに /home 配下に .log というディレクトリがあり、その中に mrr-thunderbird.log というファイルにログ情報をどんどん追記して行く形式です。
(.log は何故かわかりませんが、すでに作成されていました)

でもまあ、この方法でもログファイルは肥大化し続けることになるのでいずれにせよメンテナンスは必要です。

(追記)
リダイレクトを調整し、ファイルへの追記(>>)ではなく上書き更新(>)としました。直近の 1回分のログ情報しか残りませんが、肥大化するファイルをメンテナンスする必要はなくなりました。

*/15 * * * * $HOME/mrr-thunderbird.sh > $HOME/.log/mrr-thunderbird.log

(ここまで)


最後に

あとは PC を再起動した時に /tmp に記録された crontab の内容がどうなっているかを確認できればおしまいですね。こちらは次に PC を再起動した時に確認してみようと思います。


その後

PC を再起動したので crontab -l で定義内容を確認してみたところ、しっかりと以前の定義内容が記録されていました。

どうも定義内容としては /var/spool/ユーザー名 というファイルに記録されるのですが、crontab -e では一時的に /tmp 内のファイルに編集を行い、編集完了後に /tmp の内容を /var/spool に反映させるようです。編集中は /var/spool の本体を触らないように考慮しているようです。