javascript - 通过 pm2 从 nodejs 应用程序运行终端命令
问题描述
我只有一条路线express server
:pm2
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html);
}
和一个监听“open youtube”的 socket.io 事件处理程序(来自先前发送的index.html
)
io.on('connection', function(socket){
socket.on('open youtube', function() {
exec('start chrome youtube.com'); //yes ik, this is a windows-only solution
console.log('Opening youtube...');
});
});
虽然一切正常,但在 express 服务器上处理 emit 时,唯一有效的部分是( )console.log()
而不是exec()
( const exec = require('child_process').exec;
)
什么原因pm2
不允许我运行cmd
命令和/或如何cmd
从运行的nodejs
应用程序运行命令pm2
?
编辑:
当我使用 npm start 而不是作为 pm2 进程运行服务器时,它会使用 youtube.com 打开一个新选项卡(如预期的那样)
编辑2:
出于某种原因,在我运行 pm2 reload Ecosystem.config.js 和 pm2 save 之后,它确实起作用了。我对生态系统.config.js 所做的唯一更改是将 exec_mode 更改为 exec_mode: 'cluster' 而不是默认值 fork。
我不知道这是不是这个原因。
解决方案
exec(String) 是一个异步函数,你可能有一个你不知道的错误,像这样传递一个回调:
exec('start chrome youtube.com', (error, stdout, stderr) => {
if (error) {
// handle error
} else {
// handle success
}
});
你也可以使用同步版本
try {
let res = execSync('start chrome youtube.com');
} catch(err){
// handle error
return;
}
// handle success
推荐阅读
- java - Java中泛型类类型的转换和数组
- python - 如何调用异步函数并阻止所有其他协程直到它完成?
- sql - 选择列中的唯一值
- tableau-api - 当您有组合主键时如何在 Tableau 中进行循环
- python - 在 M1 MacBook Pro 中安装 libjpeg 时如何修复错误?
- amazon-web-services - AWS Lambda:无法恢复函数。该函数的执行角色无权执行此操作
- python - 如何将笛卡尔问题转换为圆柱问题?
- mysql - SQL中的字符串到日期时间
- vba - 如何在 AdvancedSearch 中应用 DASL 过滤器?
- stack - 如何在堆栈溢出时重新打开问题