当前位置: 首页 > news >正文

海阳市最新新闻热点企业官网优化

海阳市最新新闻热点,企业官网优化,江门排名优化公司,网站建设费汇算清缴接到需求需要一个服务来执行shell脚本#xff0c;要求可以实时打印shell脚本执行的过程#xff0c;并看到脚本执行的结果。明确任务目标#xff1a;这是一个web服务#xff0c;需要执行shell脚本当一个脚本执行的时候#xff0c;再次发送请求需要等待当前脚本执行完毕要求可以实时打印shell脚本执行的过程并看到脚本执行的结果。明确任务目标这是一个web服务需要执行shell脚本当一个脚本执行的时候再次发送请求需要等待当前脚本执行完毕再自动执行这次请求使用长连接而不是socket添加脚本不需要重启服务器这里采用的是express框架开始首先搭好express基本框架新建app.js文件, npm install expressconst express require(express);const app express();app.get(/:id, (req, res) {const { id } req.params;if (id favicon.ico) {res.sendStatus(200);return;}// 执行脚本});app.set(port, 3018);app.listen(app.get(port), () console.log(server listening at ${app.get(port)}));新建文件新建config.json用于配置id和脚本名的对应关系新建scripts目录用于存放脚本。这里定义一个函数execute参数为id和response对象代码如下const pidDict {};async function execute(id, res) {delete require.cache[require.resolve(./config.json)];const config require(./config.json);const filePath config[id];if (!filePath) {res.sendStatus(404);return;}console.log(The script:${filePath} with ${id} begin execute);const readable new Readable();readable._read () {};readable.pipe(res);while (pidDict[id]) {readable.push(\nWaiting for another script request.);await wait(5000);}const handle spawn(sh, [./scripts/${filePath}]);pidDict[id] handle.pid;handle.stdout.on(data, (data) {readable.push(\n${data});getLogger(filePath).log(\n${data});});handle.stderr.on(data, (data) {getLogger(filePath).warn(\n${data});readable.push(\n${data});});handle.on(error, (code) {getLogger(filePath).error(child process error with information: \n${code});readable.push(child process error with information: \n${code});delete pidDict[id];readable.push(null);});handle.on(close, (code) {getLogger(filePath).log(child process close with code ${code});delete pidDict[id];readable.push(null);});}解释首先要加载config.json需要注意的是因为是需要动态引入所以这里不能直接使用require(config.json)在这之前需要先删除引入的缓存delete require.cache[require.resolve(./config.json)];获取文件路径 const filePath config[id];新建读写流可以直接发送到前端。再执行脚本前需要判断当前有无脚本执行这里在外部定义了一个pidDict文件对应的id直接指向文件执行的handle的pid紧接着就是输入输出流了handle.stdout是标准输出handle.stderr是错误输出这里指的是输出的警告handle的error事件指的是脚本执行中遇到的错误也就是脚本执行不成功报的错误信息这里定义了两个外部函数一个是自定义的日志打印另一个是遇到有脚本执行时的等待新建utility.js const fs require(fs);/*** time wait** param time {number} time(ms) to wait*//* eslint-disable compat/compat */const wait async (time 1000) {return new Promise((resolve) {setTimeout(resolve, time);});};/*** set log** getLogger(path).level* level:* log* trace* debug* info* warn* error* param path*/function getLogger(path) {return require(tracer).console({transport: (data) {console.log(data.output);fs.appendFile(./logs/${path}.log, ${data.rawoutput} \n, () {});},});}module.exports {wait,getLogger,};新建脚本现在新建scripts/hello-world.sh#!/bin/shecho hello...sleep 5echo world!config.json中注册该脚本{hello-world: hello-world.sh}执行node app.js通过curl http://localhost:3018/hello-world即可观察到运行结果。附这里放上app.js的完整代码const express require(express);const { spawn } require(child_process);const { Readable } require(stream);const { wait, getLogger } require(./utility);const app express();app.get(/:id, (req, res) {// 执行脚本const { id } req.params;if (id favicon.ico) {res.sendStatus(200);return;}execute(id, res).then();});const pidDict {};/*** 执行sh脚本** param id 脚本id* param res response object*//* eslint-disable no-underscore-dangle, no-await-in-loop */async function execute(id, res) {delete require.cache[require.resolve(./config.json)];const config require(./config.json);const filePath config[id];if (!filePath) {res.sendStatus(404);return;}console.log(The script:${filePath} with ${id} begin execute);const readable new Readable();readable._read () {};readable.pipe(res);while (pidDict[id]) {readable.push(\nWaiting for another script request.);await wait(5000);}const handle spawn(sh, [./scripts/${filePath}]);pidDict[id] handle.pid;handle.stdout.on(data, (data) {readable.push(\n${data});getLogger(filePath).log(\n${data});});handle.stderr.on(data, (data) {getLogger(filePath).warn(\n${data});readable.push(\n${data});});handle.on(error, (code) {getLogger(filePath).error(child process error with information: \n${code});readable.push(child process error with information: \n${code});delete pidDict[id];readable.push(null);});handle.on(close, (code) {getLogger(filePath).log(child process close with code ${code});delete pidDict[id];readable.push(null);});}app.set(port, 3018);app.listen(app.get(port), () console.log(server listening at ${app.get(port)}));
http://www.zqtcl.cn/news/367006/

相关文章:

  • 郑州高新区做网站的公司如何欣赏网站
  • 网站做维恩图做网站的公司杭州
  • 柳州公司网站制作公司wordpress 网店
  • 网站增加栏目费用在网站开发中如何设置登录
  • 怎样用php做网站百度推广联系人
  • 怎么建立手机网站如何申请公司域名
  • 营销型网站怎么收费邓州企业网站
  • 北京建设官方网站邢台网站维护
  • 新余网站制作网站开发工资咋样
  • 襄阳网站建设外包自己做一个网站
  • 网站域名的后缀wordpress文章归类
  • 查询企业信息的官方网站大连建设网站公司
  • 网站建设 全包专业建设规划方案模板
  • 做网站好还是做微信小程序好浙江建设工程造价信息网站
  • 网站开发怎么报价推广普通话手抄报模板可打印
  • 好的平面网站模板企业网站建设浩森宇特
  • 做网站通过什么赚钱吗公司建设网站的费用
  • 如何做建筑一体化的网站视频网站开发应用到哪些技术
  • 巴中微信网站建设竞价托管一般多少钱
  • 彩票网站开发 违法股票网站排名哪个好
  • 宝格丽网站建设哈尔滨网站建设王道下拉強
  • 烟台网站建设的公司世界500强企业排名2021
  • 网络营销做得比较成功的案例吴中seo网站优化软件
  • 怎么设立网站美区下载的app怎么更新
  • 建立网站ppt做酒店网站所用到的算法
  • 上海网站建设的价格低太仓做网站的公司
  • 怎样登录建设互联网站怎么做中英文网站
  • 云网站7china中小企业网站建设好么
  • 美丽南方官网网站建设国际新闻最新消息今天摘抄
  • 牛商网营销型网站多少钱江门营销型网站建设多少钱