Pythonpath 杀我!

为了更好地D 虚拟主播们,之前用Nonebot写了个自动推送B站动态和直播消息的bot……后来发现因为Bot时不时会挂掉,所以又写了个每隔一个小时就自动重启的crontab 脚本,本以为万事大吉,没想到一个小脚本翻来覆去出了不知道多少BUG……当然,说到底还是我根本不懂更不会用Linux。特此记录一下。
我的核心需求是,定期重新杀掉一个screen,并重开它。那么毫无疑问,首先我们写这样一个脚本:
sudo screen -X -S VRBotScreen quit
sudo screen -dmS VRBotScreen python3 /home/wxzuir/VUPBot/bot.py
OK,非常简单。然而我遇到了第一个问题,我自己执行这段shell的时候毫无疑问是要输密码的,所以我难道必须要到 root 的密码,以 root 的身份加 crontab吗?
当然不是,谷歌一下,学到了新知识 sudo crontab -e 就自然修改的是 root 的 crontab了。
随后我便遇到了第二个问题——这个脚本手动执行时没有任何问题,可以重启。但是当这句话在 crontab 执行的时候,第一句执行下去没问题,但是第二句失败了。
思考一下,可能是报错了,在crontab和脚本里都加上 > /home/wxzuir/log.txt ,看看 log 结果。
咦,log居然是空的!
思来想去,发现报错是执行在 screen 里的,所以打log 需要
sudo screen -L -Logfile /home/wxzuir/log.txt -dmS VRBotScreen python3 /home/wxzuir/VUPBot/bot.py
好的,这次看到错误 log 了—— Python报错了!import的时候报错的!No module named ‘aiohttp’
???那……那为什么我手动执行么的问题呢。
继续谷歌,有人说可能是两边用的 python3 不一样。于是我需要 which python3 ,看看我的真实Python3路径,并且修改脚本变成
sudo screen -dmS VRBotScreen /usr/bin/python3 /home/wxzuir/VUPBot/bot.py
OK!这下总该好了吧!!然而重新试了一下,毫无变化。依旧是crontab 第二句不执行,依旧是报错。而手动没有问题。
好吧,只好继续查了。于是发现可能是 PYTHONPATH 的问题。于是手动对比了一下“手动执行这个脚本” 和 “Crontab执行这个脚本” 两种情况下 PYTHONPATH 的差别。比对的方法是 import sys print(sys.path)
果然不一样!手动的多了一行:/home/wxzuir/.local/lib/python3.6/site-packages 而这已经完全进入我的知识盲区了——这是谁,这在哪,这要干什么???
好吧,让我们姑且不管那么多,想想办法把这个东西加上,把脚本改成
export PYTHONPATH="${PYTHONPATH}:/home/wxzuir/.local/lib/python3.6/site-packages"
sudo screen -X -S VRBotScreen quit
sudo screen -dmS VRBotScreen /usr/bin/python3 /home/wxzuir/VUPBot/bot.py
之后又把 crontab 执行时报错的两个库 手动 pip3 install 了一下。
再试一次!哇……终于成功执行了,唯一的问题是,由于和之前的执行路径不同,出现了事故……那么最后,我们再加上一段 cd,应该就彻底解决问题了。
结论:我太菜了——