如何解决systemd用于NodeJS权限问题
我的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
运行的它不起作用,它将发生权限拒绝错误。
这是我的系统服务文件:
[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
一起使用,但是我认为这不是一个好主意。
解决方法
从路径上我可以推断出您使用ubuntu。此发行版似乎更改了sudo的默认配置:
https://serverfault.com/questions/111064/sudoers-how-to-disable-requiretty-per-user
由于您的单位系统未配置
StandardInput
和
Standardoutput
到终端。
sudo
将失败。
您必须使用sudo
配置!requiretty
才能使服务正常工作(man sudoers
):
requiretty If set,sudo will only run when the user is logged in to a real tty. When this flag is set,sudo can only be run from a login session and not via other means such as cron(8) or cgi-bin scripts. This flag is
off by default.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。