当Nodejs应用程序开始使用Systemd时,Nodejs App不会产生pythonsubprocess

我想在启动时启动节点js应用程序。 因此我从Systemd启动一项服务:

[Unit] Description=Node.js server After=network.target [Service] ExecStart=/usr/bin/node /var/www/Raspberry-Pi-Status/js/server.js Restart = always RestartSec=10 StandardOutput=syslog StandardError=syslog SyslogIdentifier=nodejs-server Environment=NODE_ENV=production PORT=8000 Environment=PYTHONPATH=/usr/bin/python [INSTALL] WantedBy=multi-user.target 

server.js看起来像这样:

 var util = require('util'), spawn = require('child_process').spawn, py = spawn('python',['temperature.py'],{detached: true}); var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'monitor', password : 'password', database : 'temps'}); var app = require('http').createServer(handler), io = require('socket.io').listen(app), fs = require('fs'), sys = require('util'), exec = require('child_process').exec, child; // Listen on port 8000 app.listen(8000); // If all goes well when you open the browser, load the index.html file function handler(req, res) { fs.readFile(__dirname+'/../index.html', function(err, data) { if (err) { // If no error, send an error message 500 console.log(err); res.writeHead(500); return res.end('Error loading index.html'); } res.writeHead(200); res.end(data); }); } py.stdout.on('data', function(data){ console.log('testing'); date = new Date().getTime(); temp = parseFloat(data); io.sockets.emit('temperatureUpdate',date,temp); }); // When we open the browser establish a connection to socket.io. // Every 5 seconds to send the graph a new value. io.sockets.on('connection', function(socket) { console.log('user connected'); }); 

node.js应用程序应该启动一个读取温度传感器的python脚本。 当我通过控制台启动node.js一切工作正常。 但是,从Systemd启动时,python脚本不会生成。 那里有什么问题? 我错过了什么吗?

在此先感谢亚历山大

    一个问题可能是手动运行vs systemd时当前工作目录的差异。 使用的spawn调用有一个默认的inheritance当前的工作目录。

    在通过shell运行的时候,这就是你目前所在的目录。在man systemd.exec ,你可以find“WorkingDirectory =`指令,它logging了systemd默认的当前工作目录:”systemd运行时默认为根目录一个系统实例“。

    所以如果你的temperature.py位于/var/www/Raspberry-Pi-Status ,那么设置:

      workingDirectory=/var/www/Raspberry-Pi-Status in your `[Service]` section.