Me gustaría iniciar mi aplicación node js en el arranque. Por lo tanto, inicio un servicio desde 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.targetEl servidor.js se ve así:
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'); });La aplicación node.js debe iniciar un script de python que lea un sensor de temperatura. Cuando inicio node.js a través de la consola, todo funciona bien. Sin embargo, cuando empiezo desde Systemd, la secuencia de comandos de python no se genera. ¿Cuál es el problema allí? ¿Me estoy perdiendo de algo?
gracias de antemano alejandro
Un problema podría ser la diferencia en el directorio de trabajo actual cuando se ejecuta manualmente frente a systemd. La llamada de spawn utilizada está documentada y tiene un valor predeterminado para heredar el directorio de trabajo actual.
Cuando se ejecuta a través del shell, ese sería el directorio en el que se encuentra actualmente. En man systemd.exec , encontrará la directiva "WorkingDirectory=`, que documenta el directorio de trabajo actual predeterminado de systemd: "predeterminado en el directorio raíz cuando systemd se ejecuta como una instancia del sistema".
Entonces, si su temperature.py se encuentra en /var/www/Raspberry-Pi-Status , configure:
workingDirectory=/var/www/Raspberry-Pi-Status in your `[Service]` section.