B站 直播室状态监听(bili_live)与 crontab

听说标题要长才有人看。

B 站状态监听也是一个吃饱了没事干试水的项目——除了例行命令行工具之外试了一下命令行可视化交互的库 inquirernodemailer 发邮件,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
}, {})

最后吐槽一下,不加分号还挺爽的,我也要倒戈!

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 成品

添加新评论