NAS の cron で m3u8

(2024-12-15)

NAS で python を使って、m3u8 ファイルを読み込んでいました。

最近、NAS の不具合でリセットする羽目になりその python がおかしくなってしまいました。

python プログラムそのものは動くのですが、cron がうまく動いてくれません。

NAS の cron

NAS に python プログラムを作成してそれを cron で動かしていました。

* 13 * * * root for i in `seq 0 10 59`;do (sleep ${i}; python /volume1/bak/iptv/python/hoge.py) & done;

でもこれがリセット後に動かなくなりました。

chatGPT にも相談したのですが、どうにも解決できません。

python /volume1/bak/iptv/python/hoge.py

は動くのですが。

通常ユーザーと root ユーザーで異なっていた

linux に転向して 8 年ほど経ちましたが、こういうことは経験していませんでした。

通常ユーザーでは以下のようにして m3u8 をインポートすることが可能なのに、

moheno@NAS720:~$ python
Python 3.8.15 (default, Nov 24 2022, 04:20:39)
[GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import m3u8
>>>

sudo -i で root に昇格するとエラーになります。

moheno@NAS720:~$ sudo -i
root@NAS720:~# python
Python 3.8.15 (default, Nov 24 2022, 04:20:39)
[GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import m3u8
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'm3u8'

なので、cron を root ではなくて通常ユーザーにしたら動くようになりました。

* 13 * * * moheno for i in `seq 0 10 59`;do (sleep ${i}; python /volume1/bak/iptv/python/hoge.py) & done;

ログは必ず記録する

ログは必ず記録した方がいいです。

* 13 * * * moheno for i in `seq 0 10 59`;do (sleep ${i}; python /volume1/bak/iptv/python/hoge.py >> /path/to/cron.log 2>&1) & done;

このログはエラーも補足されますが、エラーが出なくても記録されるようです。
一応、python には以下のように書きました。

import urllib.request
import m3u8
import os
def dn():
playlist = m3u8.load('https://hoge.m3u8')
for i, segment in enumerate(playlist.segments):
# tsファイルのパス
uri = segment.absolute_uri
print(uri)
object_name = '/volume1/bak/iptv/hoge/ts/' + uri[uri.rfind('/') + 1:]
print(object_name)
urllib.request.urlretrieve(uri, object_name)
if __name__ == '__main__':
dn()