【发布时间】:2020-08-20 13:39:30
【问题描述】:
我的NodeJS的应用app.js是一个socket.io服务器,代码如下。
如果它得到事件shutdown,我想关闭计算机。
var path = require('path')
var express = require('express')
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function (req, res) {
app.use(express.static(path.resolve('..', 'pages')));
res.sendFile(path.resolve('..', 'pages/index.html'));
});
io.on('connection', function (socket) {
console.log('a user connected');
socket.on('disconnect', function () {
console.log('user disconnected');
});
socket.on('shutdown', function () {
require('child_process').exec('/sbin/shutdown -h now', console.log);
});
});
http.listen(3000, function () {
console.log('listening on http://localhost:3000');
});
我已经让我的用户获得visudo的权限
ubuntu ALL=NOPASSWD:/sbin/shutdown
我手动运行它可以正常工作。
但是systemd运行不行,会出现permission denied错误。
这是我的 systemd 服务文件:
[Unit]
Description=app.js
After=network.target
[Service]
Type=idle
User=ubuntu
ExecStart=/home/ubuntu/.nvm/versions/node/v12.18.3/bin/node /home/ubuntu/myapp/app.js
Restart=on-failure
WorkingDirectory=/home/ubuntu/myapp
[Install]
WantedBy=multi-user.target
systemd 和 run on terminal by myself 有什么区别?
它适用于User=root,但我认为这不是一个好主意。
【问题讨论】: