前段时间买了一个腾讯云的linux(centos)服务器,打算在服务器上放一个js脚本,每天定时执行一次。
之前想过要写一个html,把js的脚本直接写进去,但是发现linux服务器并不能以打开网页的当时执行脚本(查了一些资料,发现一般都是在服务器上部署静态页面,还是需要我手动去访问,不能自动执行)。
后来发现可以使用node执行纯js脚本,不需要写在html里边,这样一来,只要在服务器上设定好每天自动执行node指令就可以了。
实操:
- 安装node,配置环境。
进入node官网,https://nodejs.org/en/download/
选择最新版本的,右键-复制链接地址
https://nodejs.org/dist/v14.15.1/node-v14.15.1-linux-x64.tar.xz
在命令行中,进入到想要安装node的文件夹(自己新建一个)
cd /usr/local/node # 我安装的目录
wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linux-x64.tar.xz # 下载已经编译好的版本,可以省去编译过程
tar -xvJf node-v14.15.1-linux-x64.tar.xz # 解压
cd node-v14.15.1-linux-x64 # 进入解压后的文件
./bin/node -v # 执行node命令 查看版本
解压文件的 bin 目录底下包含了 node、npm 等命令,使用 ln 命令来设置软连接:
ln -s /usr/local/node/node-v14.15.1-linux-x64/bin/npm /usr/local/bin/
ln -s /usr/local/node/node-v14.15.1-linux-x64/bin/node /usr/local/bin/
也可直接设置环境变量:在 etc/profile 最下边加上
# nodejs环境变量
export NODE_HOME=/usr/local/node/node-v14.15.1-linux-x64
export PATH=$NODE_HOME/bin:$PATH
这样,在任何路径下,都可以直接使用node指令
- 脚本
js脚本原本是在写在html里边的,如果想用node执行,需要有所修改。
首先,由于脚本中需要使用jquery中的$,需要引入jsdom,jquery
# 进入js脚本所在目录
cd usr/script # 我的脚本路径
npm install jquery # 安装jquery
npm install jsdom # 安装jsdom
之后,编辑脚本
vim fangyi.js
//在脚本最开始加上
const jsdom = require('jsdom');
const {JSDOM} = jsdom;
const {document} = (new JSDOM('<!doctype html><html><body></body></html>')).window;
global.document = document;
const window = document.defaultView;
const $ = require('jquery')(window);
此外,由于想要脚本自动执行,通过console.log()打印的控制台显然不太合理,因此考虑将脚本执行的信息打印到日志文件中,方法很简单
在脚本最开始加上:
const fs = require('fs');
const options = {
flags: 'a', // append模式
encoding: 'utf8', // utf8编码
};
let file = fs.createWriteStream('/usr/script/dailyLog.txt',options);
// 创建logger,用于输出到log文件
let logger = new console.Console(file,file);
//使用方法,即可写入到日志文件中
logger.log("脚本开始")
- 服务器定时
编辑crontab,可以编辑定时任务
crontab -l # 查看任务列表
crontab -e # 编辑任务
# 加入一个新任务(每天10点10分执行一次js脚本)
10 10 * * * /usr/local/node/node-v14.15.1-linux-x64/bin/node /usr/script/fangyi.js
具体crontab的格式,自行查找即可。
注:
编辑crontab时,一般的直觉是直接使用 node+脚本 就行,但是因为crontab有自己的环境,与前边配置的系统环境变量不同,所以如果想要在crontab中直接使用node指令,需要在/etc/crontab中加入node的安装路径。
但是我在实际操作时,在/etc/crontab加入了node路径,但是却执行不了,所以简单粗暴直接写的是node路径。出现这个问题可能是哪里写的不对,大家可以试试修改/etc/crontab的方式。
- 到此,服务器已经可以定时执行js脚本了,可以在对应的输出日志文件中查看执行结果。
参考:
-
node安装:https://www.runoob.com/nodejs/nodejs-install-setup.html
-
node环境使用jquery:https://www.itread01.com/content/1542875725.html
-
nodejs日志打印:https://www.jb51.net/article/138984.htm
-
crontab环境变量:https://blog.csdn.net/weixin_36343850/article/details/79217611