cron の実行結果をメールを送信するとき、結果の1行目をタイトルにする

2024/10/05 15:32 Linux

crontab の MAILTO にメールアドレスが指定されているとき、cron job の実行によって標準出力に出力があればその内容がメール送信されますが、そのときの Subject は job のコマンドの文字列となります。これだと、メールのタイトルとしてはわかりにくい(メールの内容を自然言語で説明しているものではない)ものになります。

そこで、標準出力の1行目を Subject に指定する方法を考案しました。

 | ( msg=$(cat); test -z "$msg" && exit; echo "$msg" | mail -s "`echo \"$msg\" | awk 'NR==1{printf $0}'`" "$MAILTO"

これをコマンドの右側に追記します。

具体的には crontab で次のように記述します。

1 2 * * * (echo "Disk consumption `date --iso-8601=minutes`"; df -h) | ( msg=$(cat); test -z "$msg" && exit; echo "$msg" | mail -s "`echo \"$msg\" | awk 'NR==1{printf $0}'`" "$MAILTO" )

これで毎日 2:01 am に Subject が 'Disk consumption (日付+時刻)' であるメールが届きます。この例だと mail コマンドの -s オプションに直接記述すればよいのであまりありがたみがありませんが、外部のスクリプトを呼び出すときや、出力が1行のみのコマンドを実行させるときには役に立ちます。

なお crontab で SHELL と PATH が次のように指定されているのが前提です。

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

mail コマンドは mail (GNU Mailutils) 3.17 を使用しています。

radiko 録音予約ツール

2024/10/09 15:34 LinuxPerl
radiko でインターネット配信されるラジオ番組を、指定した時刻に予約録音するツールを制作しました。

録音には うる。 氏による radish (https://github.com/uru2/radish) を利用しました。
通常では radiko そのままの m4a ファイルで保存されますが、当ツールでは録音後に m4a -> mp3 変換を掛けます。この変換を無効化することもできます。

なお当ツールは radiko 限定としましたが、radish は radiko 以外にも NHK らじる★らじる・リスラジ他多数のネットラジオに対応したソフトです。すばらしい成果を公表してくださいましたことに感謝いたします。

ソースファイル

動作要件

  • Linux など
  • radish が単独で正常に動作していること(パスの通っている場所に配置してください)
  • at (ジョブの遅延実行とバッチ処理) がインストールされていること。

実行方法の例

当ツール rec-radiko.pl を実行権をつけて、パスの通っている場所 (/usr/local/bin/ など) に配置して、
$ rec-radiko.pl [-c|--check] [-n|--no-conversion-to-mp3] <放送局ID> <録音開始日> <録音開始時刻> <録音長(分)> <タイトル>
のように実行してください。
-c または --check任意atコマンドを発行せずに、コマンドの内容を表示します。
-n または --no-conversion-to-mp3任意録音後の mp3 形式への変換をしません。
<放送局ID>必須放送局ID
<録音開始日>必須録音開始する日付を YYYY-MM-DD 形式で指定します。 例: 2024-09-02
<録音開始時刻>必須録音開始する時刻を24時間制で hhmm または hh:mm 形式で指定します。 例: 305, 0305, 3:05, 03:05
<録音長(分)>必須録音の長さを分単位で指定します。 例: 61
<タイトル>必須タイトルを指定します。

環境変数 RADIKO_SAVE_TO に保存先のディレクトリを指定します。
~/.bashrc などに
export RADIKO_SAVE_TO=/var/radiko/save/to
のように追記すればよいでしょう。

放送局ID の確認方法

 $ radi.sh -l | perl -ne 'print if /radiko/../^$/'
を実行すると確認できます。

補足

録音時に f-radiko.smartstream.ne.jp (203.211.199.181) からこちら向きの通信 (TCP/40000台Port宛て) が来るときがあるので、拒絶しないようにします。
拒絶すると録音ができませんでした。ただし必ず来るわけではないです。(しくみがよくわかっていない)

2024-09-11対策済み: at の落とし穴 (?) セット時のカレントディレクトリがなくなってしまったときの問題

このツールでタイマー録音をセットしたのに、録音に失敗するケースがありました。
rec-radiko.pl を実行した時点のカレントディレクトリを削除して(あるいは名前変更して)しまうとダメなようでした。
at -c <job番号> で確認してみると
cd /home/*****/aaaaa/bbbbb || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
のような記述があって、at を読んだときのディレクトリが存在しなくなると失敗させるようになっていました。