我有一个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 后,它确实起作用了。我对 Ecosystem.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
关于javascript - 通过 pm2 从 nodejs 应用程序运行终端命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53353200/