B站 直播室状态监听(bili_live)与 crontab
听说标题要长才有人看。
B 站状态监听也是一个吃饱了没事干试水的项目——除了例行命令行工具之外试了一下命令行可视化交互的库 inquirer
、nodemailer
发邮件,crontab
计划任务,在上次做计划任务的时候用的还是 Python 的 plan
库,现在觉得略麻烦,还是直接写进命令行工具里方便,最后在加上 CI(第一次加还是有点小激动)。
具体的都可以在项目里看到:https://github.com/csvwolf/listen-bilibili-live
这里主要说一下踩到的一个坑,关于 系统 crontab
的问题,npm 中的 crontab
库其实一共分为两种,一种是调用系统中的 crontab 设置,当然大家基本上都没准备考虑 Windows 的计划任务,其实依赖的也就是系统 crontab 的命令。第二种是利用 Node.js 自带服务的循环执行,感觉资源消耗过大,不考虑。
但是在系统 crontab 的时候我发现我的监听并没有被触发,就怀疑 Node.js 版本是否正确(我使用 nvm 安装,所以确实有可能会有这个问题),在 crontab 中加了一条命令输出 node --version
,果然是有问题,但是 crontab 针对不同用户有着不同的设置,为什么 nvm use
对于 crontab 就不生效呢——于是最终大佬告诉我在我们登录 ssh 时会载入一系列文件包括诸如 .bashrc
之类的文件,我们的 $PATH
也是在那个位置指定的,但是 crontab 并不会经过这一步,所以就会存在找不到命令的问题,最好的方法当然还是定义绝对路径去运行:
crontab.create(`${process.execPath} ${path.resolve(__dirname, '../index.js')} run`).minute().every(1)
最后分享一段代码,想吐槽自己灵光一现写了一段自动注册命令,这样就不用人工一个个引用了:
const fs = require('../libs/fs')
const path = require('path')
const files = fs.readdirSync(__dirname)
let commands = {}
module.exports = files.reduce((obj, file) => {
const ext = path.extname(file)
if (ext !== '.js') return obj
if (file === 'index.js') return obj
obj[path.basename(file, ext).toUpperCase()] = require(path.resolve(__dirname, file))
return obj
}, {})
最后吐槽一下,不加分号还挺爽的,我也要倒戈!
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。