CodeSky 代码之空

随手记录自己的学习过程

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

2017-06-02 22:18分类: JavaScript评论: 0

听说标题要长才有人看。

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 并不会经过这一步,所以就会存在找不到命令的问题,最好的方法当然还是定义绝对路径去运行:

1crontab.create(`${process.execPath} ${path.resolve(__dirname, '../index.js')} run`).minute().every(1)
2

最后分享一段代码,想吐槽自己灵光一现写了一段自动注册命令,这样就不用人工一个个引用了:

1const fs = require('../libs/fs')
2const path = require('path')
3
4const files = fs.readdirSync(__dirname)
5let commands = {}
6
7module.exports = files.reduce((obj, file) => {
8  const ext = path.extname(file)
9  if (ext !== '.js') return obj
10  if (file === 'index.js') return obj
11  obj[path.basename(file, ext).toUpperCase()] = require(path.resolve(__dirname, file))
12  return obj
13}, {})
14

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

评论 (0)