HLS 配信を自前サーバでやっていると、過去の動画が延々と貯まっていく。
$ ls /var/www/html/*.ts
...
/var/www/html/out52300.ts /var/www/html/out52323.ts /var/www/html/out52346.ts
/var/www/html/out52301.ts /var/www/html/out52324.ts /var/www/html/out52347.ts
/var/www/html/out52302.ts /var/www/html/out52325.ts /var/www/html/out52348.ts
/var/www/html/out52303.ts /var/www/html/out52326.ts /var/www/html/out52349.ts
/var/www/html/out52304.ts /var/www/html/out52327.ts /var/www/html/out52350.ts
/var/www/html/out52305.ts /var/www/html/out52328.ts /var/www/html/out52351.ts
/var/www/html/out52306.ts /var/www/html/out52329.ts /var/www/html/out52352.ts
/var/www/html/out52307.ts /var/www/html/out52330.ts /var/www/html/out52353.ts
/var/www/html/out52308.ts /var/www/html/out52331.ts /var/www/html/out52354.ts
/var/www/html/out52309.ts /var/www/html/out52332.ts /var/www/html/out52355.ts
/var/www/html/out52310.ts /var/www/html/out52333.ts /var/www/html/out52356.ts
/var/www/html/out52311.ts /var/www/html/out52334.ts /var/www/html/out52357.ts
/var/www/html/out52312.ts /var/www/html/out52335.ts /var/www/html/out52358.ts
/var/www/html/out52313.ts /var/www/html/out52336.ts /var/www/html/out52359.ts
/var/www/html/out52314.ts /var/www/html/out52337.ts /var/www/html/out52360.ts
/var/www/html/out52315.ts /var/www/html/out52338.ts /var/www/html/out52361.ts
/var/www/html/out52316.ts /var/www/html/out52339.ts /var/www/html/out52362.ts
/var/www/html/out52317.ts /var/www/html/out52340.ts /var/www/html/out52363.ts
/var/www/html/out52318.ts /var/www/html/out52341.ts /var/www/html/out52364.ts
/var/www/html/out52319.ts /var/www/html/out52342.ts /var/www/html/out52365.ts
/var/www/html/out52320.ts /var/www/html/out52343.ts /var/www/html/out52366.ts
/var/www/html/out52321.ts /var/www/html/out52344.ts /var/www/html/out52367.ts
/var/www/html/out52322.ts /var/www/html/out52345.ts
このままでは HDD が溢れてしまうので、定期的にデータを古い順に削除する方法を探った。
参考:
以下の参考ページが役に立った。
cron設定手順
1. cronを設定するためのエディタを起動
-uオプション
で指定したユーザーで cronを設定したコマンドが実行されます。crontab -u root -e
2. cronの設定を記述
以下の書式に従って記述します。
分 時 日 月 曜日 <実行コマンド>
固定指定
以下のように設定すると、15時になる度に実行されます。
0 15 * * * echo "hello."
間隔指定
間隔を指定したい場合は、以下のようにします。 例では、5分毎に実行されます。
*/5 * * * * echo "hello."
複数指定
複数時間を設定したい場合はカンマ(,)で区切ります。 例では、午前2時5分と午前2時10分に実行されます。
5,10 2 * * * echo "hello."
範囲指定
複数指定よりも範囲で指定した方がいい場合があります。 以下のようにすると、指定範囲で実行できます。 例では、午前2時5分、午前3時5分、午前4時5分、午前5時5分に実行されます。
5 2-5 * * * echo "hello."
上記の書式で記述後、保存してエディタを閉じると設定完了です。
以下の要件のジョブを作成した。
以下のシェルスクリプトで個数が導出できることを実験して確かめた。
$ ls /var/www/html/ | grep -E "*\.ts" | wc -l
今回の場合、ファイル名は out*.ts
、 *
に数字が入ることがわかっている。
この数字が小さい順にソートして、先頭50個を rm
に渡すことができたら問題なさそうだ。
ということで、上記のシェルスクリプトを少し改良し、
$ ls /var/www/html/ | grep -E "*\.ts" | sort -t 't' -k 2n,2 | head -50
out*.ts
なので t
を区切り文字にして2列めをソートする設定で実現できた。
$ ls /var/www/html/ | grep -E "*\.ts" | sort -t 't' -k 2n,2 | head -50
out52450.ts
out52451.ts
out52452.ts
out52453.ts
out52454.ts
out52455.ts
out52456.ts
out52457.ts
out52458.ts
out52459.ts
out52460.ts
...
out52499.ts
だが、出力結果にファイルパスが足りないので追加する。
$ ls /var/www/html/ | grep -E "*\.ts" | sort -t 't' -k 2n,2 | head -50 | sed -e 's:^:/var/www/html/:g'
/var/www/html/out52450.ts
/var/www/html/out52451.ts
/var/www/html/out52452.ts
/var/www/html/out52453.ts
/var/www/html/out52454.ts
/var/www/html/out52455.ts
/var/www/html/out52456.ts
/var/www/html/out52457.ts
/var/www/html/out52458.ts
/var/www/html/out52459.ts
/var/www/html/out52460.ts
...
/var/www/html/out52499.ts
1これを rm
に渡せれたら先頭50個を削除できそうだ。
で、こうなった。
#!/bin/sh
FILECOUNT=$(ls /var/www/html/ | grep -E "*\.ts" | wc -l)
if test $FILECOUNT -gt 100 ; then
ls /var/www/html/ | grep -E "*\.ts" | sort -t 't' -k 2n,2 | head -50 | sed -e 's:^:/var/www/html/:g' | xargs rm
fi
仮で remove_old.sh とする。
これを任意のディレクトリに置いて、 cron
で定期実行させる。例えば5分ごとの場合
sudo crontab -u root -e
...
*/5 * * * * /path/to/shdir/remove_old.sh
という設定を書き cron
を再起動させる。
Start/Stop/Restart cron service in Debian/Ubuntu
If you are using Debian/Ubuntu Linux login as root and use the following commands.
Start cron service
To start cron service, enter:
$ sudo /etc/init.d/cron start
Or
$ sudo service cron start
$ sudo service cron restart
5分毎に動作しているかを /var/log/syslog で確認する。
$ sudo cat /var/log/syslog | tail
Apr 30 17:10:01 crontestuser CRON[25948]: (root) CMD (/path/to/shdir/remove_old.sh)
Apr 30 17:15:01 crontestuser CRON[26751]: (root) CMD (/path/to/shdir/remove_old.sh)
Apr 30 17:20:02 crontestuser CRON[27510]: (root) CMD (/path/to/shdir/remove_old.sh)
Apr 30 17:25:01 crontestuser CRON[28318]: (root) CMD (/path/to/shdir/remove_old.sh)
よさそう。